1

我正在使用 Nlog 来编写日志文件。除非我们使用 Microsoft Excel 打开日志文件,否则它运行良好。但是,如果我使用记事本/记事本++ 打开它可以正常工作。即使文件是用 Excel 打开的,也可以记录消息。

这是我的 NLog 配置代码。

public class NLogLogger
{
    public static Logger Instance { get; private set; }

    public NLogLogger()
    {
        // Step 1. Create configuration object 
        LoggingConfiguration config = new LoggingConfiguration();

        // Step 2. Create targets and add them to the configuration 

        FileTarget fileTarget = new FileTarget();
        config.AddTarget("file", fileTarget);

        // Step 3. Set target properties 
        CsvLayout csvLayout = new CsvLayout();

        CsvColumn dateColumn = new CsvColumn() { Name = "Time", Layout = @"${date:format=dd.MM.yyyy HH\:mm\:ss}" };
        csvLayout.Columns.Add(dateColumn);

        CsvColumn levelColumn = new CsvColumn() { Name = "Level", Layout = @"${level:uppercase=true}" };
        csvLayout.Columns.Add(levelColumn);

        CsvColumn loggerColumn = new CsvColumn() { Name = "Logger", Layout = @"${logger}" };
        csvLayout.Columns.Add(loggerColumn);

        CsvColumn messageColumn = new CsvColumn() { Name = "Message", Layout = @"${message}" };
        csvLayout.Columns.Add(messageColumn);

        CsvColumn exceptionColumn = new CsvColumn() { Name = "Exception", Layout = @"${exception:format=ToString}" };
        csvLayout.Columns.Add(exceptionColumn);

        fileTarget.ArchiveNumbering = ArchiveNumberingMode.Date;
        fileTarget.ArchiveEvery = FileArchivePeriod.Day;
        fileTarget.FileName = "${basedir}/file.csv";
        fileTarget.Layout = csvLayout;

        // Step 4. Define rules
        LoggingRule rule = new LoggingRule("*", LogLevel.Debug, fileTarget);
        config.LoggingRules.Add(rule);

        // Step 5. Activate the configuration
        LogManager.Configuration = config;

        InternalLogger.LogFile = @"c:\temp\LoggerErrors.txt";

        // set internal log level
        InternalLogger.LogLevel = LogLevel.Trace;

        // Example usage
        Instance = LogManager.GetLogger("NLogLogger");   
    }

    public void LogError(Exception exception, string message = "")
    {
        Instance.ErrorException(message, exception);
    }
}
4

2 回答 2

4

在默认模式下以excel打开文件时,您无法登录到文件,因为excel会锁定文件。您可以先复制文件,然后在 excel 中打开复制的文件。这将使原始文件解锁以进行记录。记事本在打开文件时不会锁定文件。

但是,您也可以使用 /r 开关使 excel 以只读方式打开文件:

EXCEL.EXE /r <your file name>

您可以更改注册表中的默认值:

[HKEY_CLASSES_ROOT\Excel.CSV\shell\Open_in_read_only_Excel]
@="Open read-only in Excel"

[HKEY_CLASSES_ROOT\Excel.CSV\shell\Open_in_read_only_Excel\command]
@="\"C:\\Program Files (x86)\\Microsoft Office\\Office12\\EXCEL.EXE\" /r \"%1\""
于 2013-10-22T14:28:33.140 回答
2

不是您问题的答案,但不推荐您包装 NLog Logger 的方式。以这种方式包装会丢失许多重要的 NLog 功能。您无法控制程序不同部分的日志记录级别。您无法获得良好的调用站点信息(调用站点将始终是您的包装器的日志记录方法,而不是您的代码中日志记录语句所在的位置)。输出中每个日志语句的“记录器名称”将是包装器的类型名,这使得确定日志输出的来源(在您的代码中)变得更加困难。

只要正确完成,包装记录器就可以了。关键是使用单个 Logger 实例(不是单个 Logger 单例)并使用 Logger.Log 方法,将包装器的类型名作为第一个参数传递。请在此处查看有关正确包装 NLog 的先前问题的这些答案:

包装 NLog 时如何保留调用点信息

使用 wrapper 时 Nlog Callsite 错误

匹配特定 NLog 记录器名称的问题

祝你好运!

于 2013-10-22T14:45:36.857 回答