我有一个服务应用程序,它在启动时读取XML文件并为XML文件中的每个条目启动一个线程.每个线程都会创建一个worker类的实例,该实例需要记录器将任何输出记录到特定于线程的日志文件中.
在服务app.config中,我将log4net配置设置设置为使用XML appender,并将文件指定为PatternString,如下所示:
<appender name="XmlAppender" type="log4net.Appender.FileAppender">
  <file type="log4net.Util.PatternString" value="D:\Temp\Logs\%property{LogName}.log" />
  <immediateFlush value="true"/>
  <appendToFile value="true" />
  <layout type="log4net.Layout.SimpleLayout" />
</appender>
在创建的worker类的每个实例的线程锁定方法中,我使用该log4net.LogManager.GetLogger("MyLogger")方法获取记录器,然后使用设置当前线程PatternStrings LogName属性ThreadContext.Properties["LogName"] = "Log name prefix".
所有文件都已创建,但是当调用记录器时,它只会将所有消息记录到一个看似随机的文件中.
我已经搜索了很长一段时间试图找到一个解决方案或一些我做错的答案,但我没有运气.
有谁知道为什么会这样?
是的,这个问题类似于: How to log into separate files per thread with Log4Net? 除了直到运行时我不知道线程的数量或它们的名称。我的 Windows 应用程序为每个用户生成一个线程,为该用户执行长时间运行的工作。我想为每个用户/线程创建一个单独的日志文件。
log4net.Config.XmlConfigurator.Configure()?(请详细说明如何实现日志记录。)
这是一个示例配置(我无法让 thread_name 属性与多个线程一起使用):
<log4net debug="false">
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
  <!--need to replace LogDir in code like this:  log4net.GlobalContext.Properties["LogDir"] = "c:\programdata\myapp"-->
  <file type="log4net.Util.PatternString" value="%property{LogDir}\logs\mylogfile_%property{thread_name}.log" />
  ...
和代码:
public class MyMultiThreadedClassForUsers
{
    private log4net.ILog Log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
    public void Start()
    {
        log4net.GlobalContext.Properties("LogDir") = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)        
        log4net.Config.XmlConfigurator.Configure()
        List<IUser> users = GetAllUsersFromDB();
        foreach (IUser user in users) {
            System.Threading.Thread t = new System.Threading.Thread(CallBackMethod);
            t.Name = user.FirstName; …是否有可能从特定线程中过滤掉日志条目?
我使用nunit来运行测试(c#):
using System;
using NUnit.Core;
using log4net;
namespace Main
{
    public class Program
    {
        public static readonly ILogger log = LogManager.GetLogger(typeof(Program));
        static void Main(string[] args)
        {
            log.Info("start");
            TestPackage package = new TestPackage(@"C:\Test\Main.Tests.dll");
            RemoteTestRunner remoteTestRunner = new RemoteTestRunner();
            remoteTestRunner.Load(package);
            TestResult result = remoteTestRunner.Run(new NullListener(), TestFilter.Empty, true, LoggingThreshold.All);
            log.Info("end");
        }
    }
}
这是我得到的日志记录:
INFO  17:57:24 [1] Main.Program - start
ERROR 17:57:25 [TestRunnerThread] Main.TestedClass - Exception! Relevant for production / okay in test
INFO  17:57:26 [1] Main.Program - end
每次记录ERROR时,log4net都会向我发送邮件.如果我运行测试,我不想收到那些邮件.nunit将thread-name设置为:"TestRunnerThread".我怎么能忽略这个帖子?
我正在运行一个 gstreamer 示例程序,它作为线程从 C++ 应用程序中调用。已设置GST_DEBUG=*:5级别以捕获所有可能的场景。
该应用程序还在标准输出上打印大量日志,gstreamer 线程也执行相同的操作(级别 5 增加了痛苦)。
问题 - 有没有办法在给定调试级别的文件中分离出 gstreamer 线程的日志打印?
补充问题——根据答案下面的答案设置 GST_DEBUG_FILE 但文件从某些字符开始而不是从 GST_DEBUG 开始
0:00:00.000036045 ^[[335m21088^[[00m  0x8405800 ^[[37mLOG    ^[[00m ^[[00;01;33m           GST_DEBUG gstinfo.c:1329:for_each_threshold_by_entry:^[[00m category default matches pattern 0x8405570 - gets set to level 5  
0:00:00.000109741 ^[[335m21088^[[00m  0x8405800 ^[[32;01mINFO   ^[[00m ^[[00;01;31m            GST_INIT gst.c:613:init_pre:^[[00m Initializing GStreamer Core Library version 0.10.36  
0:00:00.000123496 ^[[335m21088^[[00m  0x8405800 ^[[32;01mINFO   ^[[00m ^[[00;01;31m            GST_INIT gst.c:614:init_pre:^[[00m Using library installed in /usr/lib/i386-linux-gnu 
Q2 如何删除像 "^[[" 这样的字符并从 GST 开始?
参考文献
发现了一个类似的问题