csv文件打开时记录失败

时间:2013-10-22 14:21:52

标签: .net csv nlog

我正在使用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);
    }
}

2 个答案:

答案 0 :(得分: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\""

答案 1 :(得分:2)

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

只要正确完成,包装记录器就可以了。关键是使用单独的Logger实例(不是单个Logger单例)并使用Logger.Log方法,将包装器的typename作为第一个参数传递。请参阅以下有关正确包装NLog的问题的答案:

How to retain callsite information when wrapping NLog

Nlog Callsite is wrong when wrapper is used

Problem matching specific NLog logger name

祝你好运!