【发布时间】:2023-03-07 18:25:01
【问题描述】:
大家早上好。
我编写了一个单一的 C# 2.0 应用程序(称为 myapp)。
Myapp 被多次调用,每次调用都会生成一种“任务”,将在单独的线程中执行。
如果短时间内多次调用myapp,任务是并行执行的。
通常我使用 log4net 进行日志记录;我配置它在启动时通过XmlConfigurator.Configure(<config>.xml) 加载一个xml 文件,然后我在每个需要记录器的类中使用静态LogManager.GetLogger(name),非常简单。
相反,这种情况具有挑战性。 我需要做的是:根据每次调用时收到的一个参数(称为 arg),我需要获取一个不同的 RollingFileAppender 来登录不同的文件, 即G。 .log。
举个例子:
第一个电话:myapp.exe -arg:01
- myapp 创建 thread1
- 将新的 RollingFileAppender 设置为 01.log 文件,如果不存在
- 此线程中使用的对象必须登录 01.log 文件
第二次通话:myapp.exe -arg:02
- 创建线程2
- 将新的 RollingFileAppender 设置为 02.log 文件,如果不存在
- 此线程中使用的对象必须登录 02.log 文件,而不是 log.01
第三次通话:myapp.exe -arg:01
- 创建线程03
- 获取 RollingFileAppender 到 01.log 文件(它已经存在!)
- 此线程中使用的对象必须登录 01.log 文件,而不是 log.02
等等。
我不需要将 RollingAppender 的配置留在 xml 文件中,我可以通过编程方式创建它;我的想法是使用一个静态包装类,称之为 LogHelper,如果它们不存在,则基于 arg 创建附加程序,并在对象需要时调度正确的 ILog 实例(在类中我会使用一些东西像ILog log = LogHelper.GetLogger(name, arg) 来使用记录器来代替默认的log4net 方法LogManager.GetLogger(name))。
因此,如果我在 2 个不同的线程中有 2 个同一类的实例,当我记录消息时,每个文件都会发送一个消息,具体取决于 arg(我将在每个对象中注入 arg,如果需要)。
我在 StackOverflow 中浏览了许多线程,但我找不到解决方案。
有人能指出正确的方向吗?
提前致谢。
【问题讨论】:
标签: c# multithreading logging log4net