log4j 日志文件名?

发布于 2024-07-04 08:13:07 字数 123 浏览 4 评论 0原文

我们有多个并发运行的作业,它们必须使用相同的 log4j 配置信息。 他们都使用相同的附加程序将日志转储到一个文件中。 有没有办法让每个作业动态命名其日志文件,以便它们保持独立?

谢谢
汤姆

We have several jobs that run concurrently that have to use the same config info for log4j. They are all dumping the logs into one file using the same appender. Is there a way to have each job dynamically name its log file so they stay seperate?

Thanks

Tom

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(10

还在原地等你 2024-07-11 08:13:07

您可以实现以下内容:

  • 一个 ThreadLocal 持有者,用于您的工作身份。
  • 扩展 FileAppender,您的 FileAppender 必须为每个作业身份保留一个包含 QuietWriter 的 Map。 在 subAppend 方法中,您从 ThreadLocal 获取作业的标识,查找(或创建)QuietWriter 并写入它...

如果您愿意,我可以通过邮件向您发送一些代码...

you may implement following:

  • A ThreadLocal holder for the identity of your job.
  • Extend FileAppender, your FileAppender has to keep a Map holding a QuietWriter for every job identity. In method subAppend, you get the identity of your job from the ThreadLocal, you look up (or create) the QuietWriter and write to it...

I may send you some code by mail if you wish...

呆萌少年 2024-07-11 08:13:07

您可以在初始化作业时以编程方式配置 log4j。

您还可以在运行时通过系统属性设置 log4j.properties 文件。 来自手册

将资源字符串变量设置为 log4j.configuration 系统属性的值。 指定默认初始化文件的首选方法是通过 log4j.configuration 系统属性。 如果系统属性 log4j.configuration 未定义,则将字符串变量资源设置为其默认值“log4j.properties”。

假设您从不同的 java 命令运行作业,这将使它们能够使用不同的 log4j.properties 文件和每个作业的不同文件名。

如果不具体了解您的工作是如何运作的,就很难说!

You could programmatically configure log4j when you initialize the job.

You can also set the log4j.properties file at runtime via a system property. From the manual:

Set the resource string variable to the value of the log4j.configuration system property. The preferred way to specify the default initialization file is through the log4j.configuration system property. In case the system property log4j.configuration is not defined, then set the string variable resource to its default value "log4j.properties".

Assuming you're running the jobs from different java commands, this will enable them to use different log4j.properties files and different filenames for each one.

Without specific knowledge of how your jobs are run it's difficult to say!

是你 2024-07-11 08:13:07

汤姆,您可以为每个作业指定和附加程序。 假设您有 2 个作业对应于两个不同的 java 包 com.tom.firstbatch 和 com.tom.secondbatch,您将在 log4j.xml 中看到如下内容:

   <category name="com.tom.firstbatch">
      <appender-ref ref="FIRST_APPENDER"/>
   </category>
   <category name="com.tom.secondtbatch">
      <appender-ref ref="SECOND_APPENDER"/>
   </category>

Tom you coud specify and appenders for each job. Let's that you have 2 jobs corresponding to two different java packages com.tom.firstbatch and com.tom.secondbatch, you would have something like this in log4j.xml :

   <category name="com.tom.firstbatch">
      <appender-ref ref="FIRST_APPENDER"/>
   </category>
   <category name="com.tom.secondtbatch">
      <appender-ref ref="SECOND_APPENDER"/>
   </category>
寄风 2024-07-11 08:13:07

基于 shadit 的答案。 如果每个作业都可以通过启动哪个类的 main 方法来识别,则可以使用包含启动的类的全名的系统属性 sun.java.command 。 例如这样:

log4j.appender.LOGFILE.File=${sun.java.command}.log

我将它与 TimestampFileAppender 一起使用,如下所示:

log4j.appender.LOGFILE=TimestampFileAppender
log4j.appender.LOGFILE.TimestampPattern=yyyy_MM_dd__HH_mm
log4j.appender.LOGFILE.File=${sun.java.command}_{timestamp}.log

当我开发时就是这样在 Eclipse 中,我为运行的每个新进程获取一个新的日志文件,由带有 main 方法的类的类名及其启动时间来标识。

Building on shadit's answer. If each job can be identified by which class' main method was started you can use the system property sun.java.command that contais the full name of the class started. For instance like this:

log4j.appender.LOGFILE.File=${sun.java.command}.log

I use it together with a TimestampFileAppender like this:

log4j.appender.LOGFILE=TimestampFileAppender
log4j.appender.LOGFILE.TimestampPattern=yyyy_MM_dd__HH_mm
log4j.appender.LOGFILE.File=${sun.java.command}_{timestamp}.log

This way when I'm developing in Eclipse I get a new log file for each new process that I run, identified by the classname of the class with the main method and the time it was started.

二手情话 2024-07-11 08:13:07

log4j.logger.com.foo.admin=,AdminFileAppender
log4j.logger.com.foo.report=,ReportFileAppender

这是执行此任务的另一种方法..这里 com.foo.admin 是完整的包名称

log4j.logger.com.foo.admin=,AdminFileAppender
log4j.logger.com.foo.report=,ReportFileAppender

It's another way to do this task.. here com.foo.admin is the full package name

溺孤伤于心 2024-07-11 08:13:07

我们的系统中也实现了类似的功能。 我们将特定的记录器存储在 HashMap 中,并根据需要为每个记录器初始化附加程序。

下面是一个示例:

public class JobLogger {
private static Hashtable<String, Logger> m_loggers = new Hashtable<String, Logger>();
private static String m_filename = "...";  // Root log directory

public static synchronized void logMessage(String jobName, String message)
{
    Logger l = getJobLogger(jobName);
    l.info(message);
}

public static synchronized void logException(String jobName, Exception e)
{
    Logger l = getJobLogger(partner);
    l.info(e.getMessage(), e);
}

private static synchronized Logger getJobLogger(String jobName)
{
    Logger logger = m_loggers.get(jobName);
    if (logger == null) {
        Layout layout = new PatternLayout("...");
        logger = Logger.getLogger(jobName);
        m_loggers.put(jobName, logger);
        logger.setLevel(Level.INFO);
        try {
            File file = new File(m_filename);
            file.mkdirs();
            file = new File(m_filename + jobName + ".log");
            FileAppender appender = new FileAppender(layout, file.getAbsolutePath(), false);
            logger.removeAllAppenders();
            logger.addAppender(appender);
    }
        catch (Exception e)
    { ... }
    }
    return logger;
}
}

然后,要在作业中使用此功能,您只需使用如下所示的一行条目:

JobLogger.logMessage(jobName, logMessage);

这将为每个作业名称创建一个日志文件,并将其放入您指定的任何目录中具有该作业名称的自己的文件中。

您可以摆弄其他类型的附加程序等,正如所写的,它将继续附加,直到 JVM 重新启动,如果您在始终运行的服务器上运行相同的作业,这可能无法工作,但这给出了它如何进行的一般概念工作。

We have something similar implemented in our system. We store the specific loggers in a HashMap and initialize appenders for each of them as needed.

Here's an example:

public class JobLogger {
private static Hashtable<String, Logger> m_loggers = new Hashtable<String, Logger>();
private static String m_filename = "...";  // Root log directory

public static synchronized void logMessage(String jobName, String message)
{
    Logger l = getJobLogger(jobName);
    l.info(message);
}

public static synchronized void logException(String jobName, Exception e)
{
    Logger l = getJobLogger(partner);
    l.info(e.getMessage(), e);
}

private static synchronized Logger getJobLogger(String jobName)
{
    Logger logger = m_loggers.get(jobName);
    if (logger == null) {
        Layout layout = new PatternLayout("...");
        logger = Logger.getLogger(jobName);
        m_loggers.put(jobName, logger);
        logger.setLevel(Level.INFO);
        try {
            File file = new File(m_filename);
            file.mkdirs();
            file = new File(m_filename + jobName + ".log");
            FileAppender appender = new FileAppender(layout, file.getAbsolutePath(), false);
            logger.removeAllAppenders();
            logger.addAppender(appender);
    }
        catch (Exception e)
    { ... }
    }
    return logger;
}
}

Then to use this in your job you just have to use a one line entry like this:

JobLogger.logMessage(jobName, logMessage);

This will create one log file for each job name and drop it in its own file with that job name in whichever directory you specify.

You can fiddle with other types of appenders and such, as written it will continue appending until the JVM is restarted which may not work if you run the same job on a server that is always up, but this gives the general idea of how it can work.

油焖大侠 2024-07-11 08:13:07

您能为每个作业传递一个 Java 系统属性吗? 如果是这样,您可以像这样进行参数化:

java -Dmy_var=somevalue my.job.Classname

然后在 log4j.properties 中:

log4j.appender.A.File=${my_var}/A.log

您可以使用主机环境(例如)中的值填充 Java 系统属性,该值将唯一标识作业实例。

Can you pass a Java system property for each job? If so, you can parameterize like this:

java -Dmy_var=somevalue my.job.Classname

And then in your log4j.properties:

log4j.appender.A.File=${my_var}/A.log

You could populate the Java system property with a value from the host's environment (for example) that would uniquely identify the instance of the job.

ゃ懵逼小萝莉 2024-07-11 08:13:07

如果提前知道作业名称,则可以在执行 getLogger() 调用时包含作业名称。 然后,您可以使用单独的文件名(或其他目标)将不同的附加程序绑定到不同的记录器。

如果您无法提前知道作业名称,您可以在运行时配置记录器,而不是使用配置文件:

FileAppender appender = new FileAppender();
appender.setFileName(...);
appender.setLayout(...);
Logger logger = Logger.getLogger("com.company.job."+jobName);
logger.addAppender(appender);

If the job names are known ahead of time, you could include the job name when you do the getLogger() call. You then can bind different appenders to different loggers, with separate file names (or other destinations).

If you cannot know the job name ahead of time, you could configure the logger at runtime instead of using a configuration file:

FileAppender appender = new FileAppender();
appender.setFileName(...);
appender.setLayout(...);
Logger logger = Logger.getLogger("com.company.job."+jobName);
logger.addAppender(appender);
三生殊途 2024-07-11 08:13:07

您可以编写自己的附加程序来组成自己的文件名,也许使用 [File.createTempFile](http://java.sun.com/j2se/1.5.0/docs/api/java /io/File.html#createTempFile(java.lang.String,%20java.lang.String)) 方法。 如果 FileAppender 类编写正确,您应该能够扩展它(或 RollingFileAppender),并重写 getFile 方法以返回您想要的文件。根据您想要添加的任何新属性进行选择。

You could write your own appender that makes up its own filename, perhaps using the [File.createTempFile](http://java.sun.com/j2se/1.5.0/docs/api/java/io/File.html#createTempFile(java.lang.String,%20java.lang.String)) method. If the FileAppender class was written correctly, you should be able to extend it—or RollingFileAppender—and override the getFile method to return one that you choose based on whatever new properties you would like to add.

小忆控 2024-07-11 08:13:07

您可以为每个作业设置 NDC 或 MDC,然后编写一个根据 NDC 或 MDC 值改变名称的附加程序。 创建一个新的附加程序并不难。 可能还有一个适合 log4j 沙箱的附加程序。 开始查看 http://svn.apache.org/viewvc/logging/ log4j/trunk/contribs/

You can have each job set NDC or MDC and then write an appender that varies the name based on the NDC or MDC value. Creating a new appender isn't too hard. There may also be a appender that will fit the bill in the log4j sandbox. Start looking in http://svn.apache.org/viewvc/logging/log4j/trunk/contribs/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文