Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.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
C# 使用静态ref log.cs类(使用log4net)创建一个日志文件的多个项目?_C#_Logging_Log4net - Fatal编程技术网

C# 使用静态ref log.cs类(使用log4net)创建一个日志文件的多个项目?

C# 使用静态ref log.cs类(使用log4net)创建一个日志文件的多个项目?,c#,logging,log4net,C#,Logging,Log4net,我知道这个问题已经被问过很多次了,但我的情况有点不同。我的解决方案中有多个项目。我有一个静态日志类,我静态引用它(添加为链接)到解决方案中的不同项目。我想使用一个日志文件来记录所有项目。我怎样才能做到这一点? 我的示例日志文件: public static class Log { private static ILog _log; public static void Initialize(Level logLevel, string logFile, string logge

我知道这个问题已经被问过很多次了,但我的情况有点不同。我的解决方案中有多个项目。我有一个静态日志类,我静态引用它(添加为链接)到解决方案中的不同项目。我想使用一个日志文件来记录所有项目。我怎样才能做到这一点? 我的示例日志文件:

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;
    }
}

谢谢@stuartd!在每个项目中使用相同的文件名就可以解决问题(还要注意锁定模型),但这也带来了另一个问题。第一个项目(第一次初始化Log.cs)正在写入日志,而另一个进程(如B、C等)在以后启动时没有将日志写入文件


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

您只需在使用该类的每个项目中使用相同的文件名。同时写入时会发生什么情况?如果有不同的进程写入该文件,请将appender的
锁定模型设置为
进程间锁定
,或者如果只有不同的线程同时写入,改为使用
MinimalLock
——有关更多信息,请参阅。谢谢!在我的案例中,不同的进程写入同一个文件。另外,第一个项目(第一次初始化)正在写入日志,而随后启动的另一个进程没有将日志写入文件?原因可能是什么?当我停止第一个进程时,第二个进程开始写入日志?因为