繁体   English   中英

log.net - RollingFileAppender

[英]log4net - RollingFileAppender

我在 log.net 上遇到有关滚动附加程序使用的问题。 当我们有多个线程时,我们创建一个 RollingAppender 来将消息记录到默认日志文件以及特定于作业的日志文件中。 我们在 RollingAppender 中设置了一个 PropertyFilter,其中一个 guid 作为正在使用的线程的键。 我们还将 ThreadContext.Properties[key] 设置为相同的键。

我们在启动作业时创建 Appender,然后在 try / catch / finally 代码的 finally 块中删除 Appender。

问题是,记录器随机创建包含 AppName.log 的子文件夹以及文件夹路径中 DatePattern 过滤器的第一部分。 例如,如果 DatePattern 是 yyyy\MM\'Today'\'{fileName}.log'" 并且 AppName 是 SampleApp.exe,那么我们随机得到一个文件夹名称如下:

SampleApp.log2022\11\Today\AppenderName.log。

执行此操作时,它会使用相同的命名约定创建多个文件夹。 所以我们最终得到一个像这样的文件夹结构:

SampleApp.log2022\11\Today\SampleApp.log2022\11\Today\SampleApp.log2022\11\Today\SampleApp.log2022\11\Today\SampleApp.log2022\11\Today\AppenderName.log

显然这是一个问题。

这是附加程序代码

public void CreateRollingFileAppender
        (
            string appenderName,
            string fileName,
            PropertyFilter filter = null,
            string logPath = ""
        )
        {
            if (logPath == "") logPath = _logConfiguration.LogPath;
            if (Root.GetAppender(appenderName) != null) return;

            var patternLayout = new PatternLayout(_logConfiguration.Appender.PatternLayout);
            var denyAllFilter = new DenyAllFilter();
            var appender = new RollingFileAppender
            {
                Name = appenderName,
                File = logPath,
                StaticLogFileName = false,
                Layout = patternLayout,
                ImmediateFlush = true,
                AppendToFile = true,
                MaxSizeRollBackups = 5,
                MaximumFileSize = _logConfiguration.Appender.MaxSize,
                RollingStyle = RollingFileAppender.RollingMode.Date,
                DatePattern = $@"yyyy\\MM\\'Today'\\'{fileName}.log'",
                LockingModel = new FileAppender.MinimalLock()
            };

            if (filter != null)
            {
                appender.AddFilter(filter);
                appender.AddFilter(denyAllFilter);
            }

            appender.ActivateOptions();

            BasicConfigurator.Configure(Repository, appender);
        }

这是生成我们正在使用的过滤器的代码:

public PropertyFilter CreateThreadFilter()
        {
            var guid = Guid.NewGuid().ToString();

            ThreadContext.Properties[Key] = guid;

            return new PropertyFilter
            {
                Key = Key,
                StringToMatch = guid,
                AcceptOnMatch = true
            };
        }

这是删除附加程序代码:

public void RemoveAppender(string appenderName)
        {
            var appender = Root.GetAppender(appenderName);

            if (appender != null)
            {
                appender.Close();
                Root.RemoveAppender(appenderName);
            }
        }

这是调用此代码的示例:


CreateRollingFileAppender("Test", "Test", CreateThreadFilter())

try
{
   ...
   logger.Info(message);
}
catch (Exception e)
{
   logger.Error(e)
}
finally
{
  RemoveAppender("Test")
}


我们定义 Repository 和 Root 如下:

var Repository = LogManager.CreateRepository(Assembly.GetEntryAssembly(), typeof(Hierarchy));

var Root is ((Hierarchy)Repository).Root

请指教。

谢谢

所以这里的问题不是代码相关,而是配置相关。 以前的开发人员使用配置文件来存储用于创建任何文件的属性。 但是,他在配置文件中将 File 属性留空。 所以当第一次启动时,它没有路径属性来创建文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM