【问题标题】:Multiple project using static ref log.cs class (using log4net ) to create one log file?使用 static ref log.cs 类(使用 log4net )创建一个日志文件的多个项目?
【发布时间】: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 @了解更多信息。
  • 谢谢!我的情况是,不同的进程写入同一个文件。此外,第一个项目(第一次初始化)正在写入日志,而稍后启动的另一个进程没有将日志写入文件?可能是什么原因 ?另外,当我停止第一个进程时,第二个进程开始写入日志?

标签: c# logging log4net


【解决方案1】:

感谢@stuartd!只需在每个项目中使用相同的文件名即可解决问题(还要注意锁定模型),但它也引入了另一个问题。 “第一个项目说 A(第一次初始化 Log.cs)正在写入日志,而稍后启动的另一个进程(比如 B、C 等)不会将日志写入文件”

实际的 Log.cs 存在于项目 B 中,我静态引用了项目 A 中的 Log.cs。现在,我将 Log.cs 类从项目 B (物理上)移动到项目 A,对于所有其他项目,我静态地引用了新文件。然后每个项目都开始在同一个文件中写入日志!

【讨论】:

    猜你喜欢
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多