.net 日志记录失败,csv文件打开
我正在使用Nlog编写日志文件。除非我们用Microsoft Excel打开日志文件,否则它工作正常。 但是,如果我使用记事本/记事本++打开,它工作正常。 即使文件是用Excel打开的,也要记录消息 这是我的NLog配置代码.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
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:感谢您提供的信息和答案()。我将更改我的代码。