Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 日志记录失败,csv文件打开_.net_Csv_Nlog - Fatal编程技术网

.net 日志记录失败,csv文件打开

.net 日志记录失败,csv文件打开,.net,csv,nlog,.net,Csv,Nlog,我正在使用Nlog编写日志文件。除非我们用Microsoft Excel打开日志文件,否则它工作正常。 但是,如果我使用记事本/记事本++打开,它工作正常。 即使文件是用Excel打开的,也要记录消息 这是我的NLog配置代码 public class NLogLogger { public static Logger Instance { get; private set; } public NLogLogger() { // Step 1. Crea

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

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

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

EXCEL.EXE /r <your file name>

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

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

EXCEL.EXE /r <your file name>

这不是对您的问题的回答,但不推荐您包装NLog记录器的方式。这样一来,您将失去许多重要的NLog功能。您无法控制程序不同部分中的日志记录级别。您无法获得好的调用站点信息(调用站点将始终是包装器的日志记录方法,而不是日志记录语句所在的代码位置)。输出中每个日志语句的“logger name”都将是包装器的typename,因此很难确定日志输出的来源(在代码中)

包装记录器很好,只要操作正确。关键是使用单个记录器实例(而不是单个记录器单例)和使用Logger.Log方法,将包装器的typename作为第一个参数传递。关于正确包装NLog,请参见以下问题的答案:


祝你好运

这不是对您的问题的回答,但不推荐您包装NLog记录器的方式。这样一来,您将失去许多重要的NLog功能。您无法控制程序不同部分中的日志记录级别。您无法获得好的调用站点信息(调用站点将始终是包装器的日志记录方法,而不是日志记录语句所在的代码位置)。输出中每个日志语句的“logger name”都将是包装器的typename,因此很难确定日志输出的来源(在代码中)

包装记录器很好,只要操作正确。关键是使用单个记录器实例(而不是单个记录器单例)和使用Logger.Log方法,将包装器的typename作为第一个参数传递。关于正确包装NLog,请参见以下问题的答案:


祝你好运

谢谢你的回答。但是我如何知道用户是否打开了文件?因为在我用excel打开日志文件后,如果日志记录失败,Nlog不会抛出异常或警告消息。事实上,您可以,很抱歉,我的第一个错误。Excel可以以只读模式打开文件。这将不会锁定您的文件。请注意,按照您现有的方式包装NLog记录器,您将无法记录呼叫站点信息(呼叫站点将始终是包装器的日志记录方法)。此外,每个日志语句的“logger”值(您可以配置为通过logger LayoutRenderer将其记录到您的输出中)将是记录器包装的类型名。@wageoghe:感谢您提供的信息和答案()。我将更改代码。谢谢您的回答。但是我如何知道用户是否打开了文件?因为在我用excel打开日志文件后,如果日志记录失败,Nlog不会抛出异常或警告消息。事实上,您可以,很抱歉,我的第一个错误。Excel可以以只读模式打开文件。这将不会锁定您的文件。请注意,按照您现有的方式包装NLog记录器,您将无法记录呼叫站点信息(呼叫站点将始终是包装器的日志记录方法)。此外,每个日志语句的“logger”值(您可以配置为通过logger LayoutRenderer将其记录到您的输出中)将是记录器包装的类型名。@wageoghe:感谢您提供的信息和答案()。我将更改我的代码。