【发布时间】:2015-11-23 13:15:37
【问题描述】:
我知道这个问题已经被问过很多次了,但我的情况有点不同。我的解决方案中有多个项目。我有一个静态 Log 类,我静态引用(添加为链接)到我的解决方案中的不同项目。我想为所有项目日志记录使用一个日志文件。我怎样才能做到这一点? 我的示例日志文件:
public static class Log
{
private static ILog _log;
public static void Initialize(Level logLevel, string logFile, string loggerName = null)
{
if (loggerName == null)
loggerName = Assembly.GetCallingAssembly().GetName().Name;
// root config
var hierarchy = (Hierarchy)LogManager.GetRepository();
hierarchy.Root.Level = logLevel;
hierarchy.Configured = true;
BasicConfigurator.Configure();
// Get logger with given name
_log = LogManager.GetLogger(loggerName);
// Add appender to log
var fileAppender = CreateFileAppender(logFile);
hierarchy.Root.AddAppender(fileAppender);
}
public static void d(string o, Exception e = null)
{
_log.Debug(o, e);
}
public static void e(string o, Exception e = null)
{
_log.Error(o, e);
}
public static void i(string o, Exception e = null)
{
_log.Info(o, e);
}
public static void w(string o, Exception e = null)
{
_log.Warn(o, e);
}
private static IAppender CreateFileAppender(string logFileName)
{
var appender = new FileAppender
{
Name = "FileAppender",
File = logFileName,
AppendToFile = true,
};
var layout = new PatternLayout
{
ConversionPattern = "%date{dd MMM yyyy HH:mm:ss,fff} [%level] [%appdomain] [%thread] [%logger] - %message%newline%exception"
};
layout.ActivateOptions();
appender.Layout = layout;
appender.ActivateOptions();
BasicConfigurator.Configure(appender);
return appender;
}
}
【问题讨论】:
-
所有你需要做的就是在使用这个类的每个项目中使用相同的文件名。
-
同时写入时会发生什么?
-
如果您有不同的进程写入文件,请将 appender 的
LockingModel设置为InterProcessLock,或者如果您只有不同的线程同时写入,请改用MinimalLock-- 参见 @987654321 @了解更多信息。 -
谢谢!我的情况是,不同的进程写入同一个文件。此外,第一个项目(第一次初始化)正在写入日志,而稍后启动的另一个进程没有将日志写入文件?可能是什么原因 ?另外,当我停止第一个进程时,第二个进程开始写入日志?