【问题标题】:Java Separate log file for separate Program ArguementsJava 用于单独程序参数的单独日志文件
【发布时间】:2012-10-07 06:35:43
【问题描述】:

我有一个文件,它根据传递给它的命令行参数将 SMS 发送到不同的移动网络。 Vodafone, 3 network, T-Mobile,O2.. etc. 所以,当争论通过时

$Run SMSDaemon 3Network  // sends sms to 3 networks's mobile users
$Run SMSDaemon Vodafone  // sends sms to Vodafone  mobile users
$Run SMSDaemon TMobile  // sends sms to TMobile  mobile users
$Run SMSDaemon O2    // sends sms to O2 mobile users

现在,我想为单独的网络创建一个单独的日志文件,以便我可以根据移动网络分别获得日志信息、调试消息。

因为,我只有一个文件 SMSDaemon 我尝试了以下方法,但它没有向文件写入任何内容。它只写入已在 log4j.properties 文件中定义的文件。所以,我很困惑在 log4j.properties 中写什么以及在这个 java 文件中写什么??

public static void main(String[] args) {
if( args.length != 1  {  return;}
networkUnique = args[0];
setLogProps(networkUnique);
//other codes and in setLogProps method 

private static void setLogProps(String networkUnique)
{
log = Logger.getLogger(networkUnique);
Properties logprops=new Properties();
logprops.setProperty("log4j.appender.file","org.apache.log4j.FileAppender");
logprops.setProperty("log4j.appender.file.maxFileSize","300MB");
logprops.setProperty("log4j.appender.file.maxBackupIndex","100");
logprops.setProperty("log4j.appender.file.File","/etc/sms/"+networkUnique+".log");
logprops.setProperty("log4j.appender.file.threshold","debug");
logprops.setProperty("log4j.appender.file.layout","org.apache.log4j.PatternLayout");
logprops.setProperty("log4j.appender.file.layout.ConversionPattern","%d [%t] %-5p  [%-35F : %-25M : %-6L] %-C -%m%n"); 
logprops.setProperty("log4j.appender.stdout","org.apache.log4j.FileAppender"); 
PropertyConfigurator.configure(logprops); 
log.info("Log message Starting for "+ networkUnique);
}

在 log4j.properties 文件中写入以下内容。所有日志都写入此属性中定义的 network.log 文件。这不符合我的要求。我需要在 SMSDaemon setLogProps 方法中定义的单独网络的单独日志。

# Define the root logger with appender file
#log = /etc/sms/
log4j.rootLogger = info, FILE

# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
#log4j.appender.FILE.File=${log}/network.log

# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

请提出建议。

提前致谢。

【问题讨论】:

    标签: java logging log4j fileappender


    【解决方案1】:

    您需要创建不同的附加程序来实现目标。 试试这个配置:

    <appender name="3Network" class="org.apache.log4j.FileAppender">
        <param name="file" value="logs/3Network.log" />
        <param name="append" value="true" />        
    </appender> 
    <appender name="Vodafone" class="org.apache.log4j.FileAppender">
        <param name="file" value="logs/Vodafone.log" />
        <param name="append" value="true" />        
    </appender> 
    <appender name="TMobile" class="org.apache.log4j.FileAppender">
        <param name="file" value="logs/TMobile.log" />
        <param name="append" value="true" />        
    </appender> 
    

    你也可以这样写:

    log4j.appender.TMobile=org.apache.log4j.FileAppender
    log4j.appender.TMobile.File=logs/TMobile.log.. 
    

    等等..

    希望这将帮助您解决问题。 另请参阅 - reference

    【讨论】:

    • 抱歉,没用!尝试使用 log4j.appender.TMobile ,还有其他建议!!
    • 它给了我错误 No appenders could be found for logger TMobile...知道它是怎么来的吗?
    • 该消息表示未找到 log4j.properties 文件。您尝试使用控制台附加程序,如果它有效,然后尝试更正您的 log4j.xml 或 log4j.properties。这可能会有所帮助 - coderanch.com/t/63230/open-source/log-log-WARN-No-appenders
    • 我有 log4j.properties 文件。当我尝试使用 TMobile 和 3 Networks 时。信息被写入两个文件,就像 3 个网络的信息也被写入 TMobile.log,反之亦然。 log4j.appender.3network=org.apache.log4j.FileAppender log4j.appender.3networks.File=${log}/3network.log log4j.appender.3networks.layout=org.apache.log4j.PatternLayout log4j.appender.3networks。 layout.ConversionPattern=%d [%t] %-5p [%-35F : %-25M : %-6L] %-C -%m%n 其他网络也一样。但现在日志已写入所有这些。
    • 那么您的日志记录类逻辑需要更新,以便将每个单独的日志转储到单独的文件中。
    【解决方案2】:

    我建议根据您的网络创建不同的 Logger 类,例如

         class com.netwrok.Network1Logger{
              public void logMessage(String className, String message, String Level);
         }
    
         class com.netwrok.Network2Logger{
              public void logMessage(String className, String message, String Level);
         }
    

    然后更新log4j.properties如下:

        # Root logger option
        log4j.rootLogger=INFO, RootFileAppender
    
        #Network1 Logger option
        log4j.logger.com.netwrok.Network1Logger=INFO,Network1FileAppender
    
        #Network2 Logger option
        log4j.logger.com.netwrok.Network2Logger=INFO,Network2FileAppender
    
    
        # RootFileAppender - used to log messages in the root.log file.
        log4j.appender.RootFileAppender=org.apache.log4j.FileAppender
        log4j.appender.RootFileAppender.File=root.log
        log4j.appender.RootFileAppender.MaxFileSize=100MB
        log4j.appender.RootFileAppender.layout=org.apache.log4j.PatternLayout
        log4j.appender.RootFileAppender.layout.ConversionPattern= %5p [%t] (%F:%L) - %m%n
    
    
        # Network1FileAppender- used to log messages in the shunted.log file.
        log4j.appender.Network1FileAppender=org.apache.log4j.FileAppender
        log4j.appender.Network1FileAppender.File=shunted.log
        log4j.appender.Network1FileAppender.MaxFileSize=10MB
        log4j.appender.Network1FileAppender.layout=org.apache.log4j.PatternLayout
        log4j.appender.Network1FileAppender.layout.ConversionPattern= %5p [%t] (%F:%L) - %m%n
    
        # Network2FileAppender- used to log messages in the shunted.log file.
        log4j.appender.Network2FileAppender=org.apache.log4j.FileAppender
        log4j.appender.Network2FileAppender.File=shunted.log
        log4j.appender.Network2FileAppender.MaxFileSize=10MB
        log4j.appender.Network2FileAppender.layout=org.apache.log4j.PatternLayout
        log4j.appender.Network2FileAppender.layout.ConversionPattern= %5p [%t] (%F:%L) - %m%n
    

    如果您不希望,root logger 将其关闭。

    【讨论】:

    • 网络很多,可能有引入新网络的条件,所以我认为这无济于事,因为我必须每次都创建新课程。还有其他想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多