将程序开始时间附加到每个日志行
Appending the program start time to each log line
我有一个 C# 程序,使用 log4net 库进行日志记录。
我试图在整个程序的每一行日志中记录程序启动时间:
class MyProgram
{
static DateTime startTime;
static void Main()
{
startTime = DateTime.Now;
Log.Info(startTime + "Program started");
MyMethod1();
//...
}
static void MyMethod1()
{
Log.Info(startTime + "method1 step1 ");
//code
Log.Info(startTime + "method1 step2");
}
}
log4net配置
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="C:\Logs\Job.json" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maximumFileSize value="20MB" />
<maxSizeRollBackups value="10" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.SerializedLayout, log4net.Ext.Json">
<decorator type="log4net.Layout.Decorators.StandardTypesDecorator, log4net.Ext.Json" />
<member value="startTime:%property{ApplicationStartTime}"/>
<member value="date:date" />
<member value="level:level" />
<member value="logger:logger" />
<member value="message:messageObject" />
<member value="exception:exception" />
</layout>
</appender>
我可以配置 log4net 以自动将程序的开始时间添加到每个日志行,而不是手动将其附加到每一行吗?
围绕 log4net 日志方法创建一个方法包装器,它接收一条消息并将其转发给 log4net 日志方法,但会为您在前面添加 startTime
。
var startTime = DateTime.Now.ToString();
void Log(string message)
{
Log.Info($"{startTime}: {message}");
}
或者您可以创建一个扩展方法:
public static class LoggerExtensions
{
public static void LogWithStartTime(this Logger self, string message)
{
var startTime = Global.GetStartTime();
self.Log($"{startTime}: ${message}");
}
}
您可以使用 log4net.GlobalContext
设置全局属性。像这样:
static void Main()
{
log4net.GlobalContext.Properties["ApplicationStartTime"] = DateTime.Now;
(...)
然后在你的日志配置中像这样访问它
%property{ApplicationStartTime}
Here is some more reading, here是一个类似的问题。
对于log4net.Ext.Json
,您可以通过这种方式引用自定义属性:
<!-- json property named after custom property -->
<member value="ApplicationStartTime"/>
<!-- json property with explicit name -->
<member value="startTime:ApplicationStartTime"/>
我有一个 C# 程序,使用 log4net 库进行日志记录。
我试图在整个程序的每一行日志中记录程序启动时间:
class MyProgram
{
static DateTime startTime;
static void Main()
{
startTime = DateTime.Now;
Log.Info(startTime + "Program started");
MyMethod1();
//...
}
static void MyMethod1()
{
Log.Info(startTime + "method1 step1 ");
//code
Log.Info(startTime + "method1 step2");
}
}
log4net配置
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="C:\Logs\Job.json" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maximumFileSize value="20MB" />
<maxSizeRollBackups value="10" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.SerializedLayout, log4net.Ext.Json">
<decorator type="log4net.Layout.Decorators.StandardTypesDecorator, log4net.Ext.Json" />
<member value="startTime:%property{ApplicationStartTime}"/>
<member value="date:date" />
<member value="level:level" />
<member value="logger:logger" />
<member value="message:messageObject" />
<member value="exception:exception" />
</layout>
</appender>
我可以配置 log4net 以自动将程序的开始时间添加到每个日志行,而不是手动将其附加到每一行吗?
围绕 log4net 日志方法创建一个方法包装器,它接收一条消息并将其转发给 log4net 日志方法,但会为您在前面添加 startTime
。
var startTime = DateTime.Now.ToString();
void Log(string message)
{
Log.Info($"{startTime}: {message}");
}
或者您可以创建一个扩展方法:
public static class LoggerExtensions
{
public static void LogWithStartTime(this Logger self, string message)
{
var startTime = Global.GetStartTime();
self.Log($"{startTime}: ${message}");
}
}
您可以使用 log4net.GlobalContext
设置全局属性。像这样:
static void Main()
{
log4net.GlobalContext.Properties["ApplicationStartTime"] = DateTime.Now;
(...)
然后在你的日志配置中像这样访问它
%property{ApplicationStartTime}
Here is some more reading, here是一个类似的问题。
对于log4net.Ext.Json
,您可以通过这种方式引用自定义属性:
<!-- json property named after custom property -->
<member value="ApplicationStartTime"/>
<!-- json property with explicit name -->
<member value="startTime:ApplicationStartTime"/>