【问题标题】:log4j writing to console but not to file (Liferay + Tomcat)log4j 写入控制台但不写入文件(Liferay + Tomcat)
【发布时间】:2013-09-09 12:25:04
【问题描述】:

我最近遇到了一些问题,我的 Liferay/Tomcat 日志被多个记录到相同文件的 portlet 阻塞,这使得有时很难追踪问题。决定我想为每个 portlet 创建一个日志文件,以便更容易跟踪问题,并且我找到了一些有用的文章,但无论我尝试什么,我都无法创建自定义日志文件(并且通过扩展写到)。根据this article,我在 liferay-plugin-package.properties 中添加了以下几行:

portal-dependency-jars=\
    log4j.jar,\
    log4j-extras.jar

我的 log4j.xml 看起来像这样:

<?xml version="1.0"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}:%L] %m%n" />    
        </layout>
    </appender>

    <appender name="FILE" class="org.apache.log4j.rolling.RollingFileAppender">

        <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
            <param name="FileNamePattern" value="../../logs/portrait-manager-portlet.%d{yyyy-MM-dd}.log" />
        </rollingPolicy>

        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}:%L] %m%n" />
        </layout>
    </appender>

    <!-- test is a legitimate package name in my code -->
    <category name="com.test" >
        <priority value="DEBUG" />
    </category>

    <root>
        <priority value="INFO" />
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>
</log4j:configuration>

最后,根据文章,日志记录是以这种方式完成的:

private static Logger log = Logger.getLogger(PortraitManagerServiceImpl.class);
log.info("testing log4j logging");

同样,如前所述,控制台日志记录工作正常,但从未创建日志文件,因此无法写入。如果有人对此行为有任何建议或见解,我将不胜感激。

编辑:我在 Liferay 6.2 b1 和 tomcat 7.0.40(包含在 Liferay 6.2 捆绑包中)

【问题讨论】:

    标签: java tomcat logging log4j liferay


    【解决方案1】:

    我正在使用log4j.properties 及其工作。 通过属性文件试试

    # Define the root logger with appender file
    log4j.rootLogger = DEBUG, FILE
    log4j.category.SimpleSign=DEBUG,FILE
    
    # Define the file appender
    log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
    # Set the name of the file
    #log4j.appender.FILE.File=${file.name}/something.out
    log4j.appender.FILE.File=${file.name}
    
    # Set the immediate flush to true (default)
    log4j.appender.FILE.ImmediateFlush=true
    
    # Set the threshold to debug mode
    log4j.appender.FILE.Threshold=debug
    
    # Set the append to false, should not overwrite
    log4j.appender.FILE.Append=true
    
    # Set the DatePattern
    log4j.appender.FILE.DatePattern='-' dd-MM-yyyy
    
    # Define the layout for file appender
    log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
    log4j.appender.FILE.layout.conversionPattern=%m%n
    

    并通过调用动态设置文件路径

    System.setProperty("file.name", FILE PATH);
    

    【讨论】:

    • 使用该技术,我得到一个 log4j:ERROR 没有为 appender [FILE] 设置 File 或 DatePattern 选项。我应该什么时候做 getLogger 来设置文件名属性,或者我应该做那件事?
    • 不设置文件路径时会发生错误,方法的第一行是system.setProperty()..
    【解决方案2】:

    您能否检查一下目录路径 ="../../logs/portrait-manager ; 是否是一个有效的 w.r.t 部署位置。 很多时候,如果您的目录不够深,(例如 C:\webapps);这种相对路径变得无效。尝试放置一个具体的路径和具体的文件名,看看这是否有效。然后你可以在文件名和相对文件路径中使用模式。

    另外,appender 定义缺少 Threshold 参数。尝试添加它,看看它是否有效。

    编辑 1:

    示例配置:

    <?xml version="1.0" encoding="UTF-8" ?> 
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
        <!-- Dos core appenders -->
    
        <appender name="serverConsoleAppender" class="org.apache.log4j.ConsoleAppender">
            <param name="Threshold" value="DEBUG" />
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%d{MM/dd HH:mm:ss} %5p [%-10t] %-10c{1} - %-70m%n" />
            </layout>
        </appender>
    
            <appender name="serverDebugLogFileAppender" class="org.apache.log4j.RollingFileAppender">
            <param name="Threshold" value="DEBUG" />
            <param name="File" value="/apps/logs/dss_debug.log" />
            <param name="MaxFileSize" value="20MB" />
            <param name="MaxBackupIndex" value="40" />
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%d{MM/dd HH:mm:ss} %5p [%-10t] %-20c{1} - %-70m%n" />
            </layout>
        </appender>
    
        <logger name="com.test" additivity="false">
            <level value="DEBUG" />
            <appender-ref ref="serverDebugLogFileAppender" />
            <appender-ref ref="serverConsoleAppender" />
        </logger>
    
    </log4j:configuration>
    

    【讨论】:

    • 路径肯定有效,Liferay SDK和tomcat服务器文件是C盘深处的两个目录,所以没问题。我还在 rollingPolicy 参数上方添加了 ,但文件仍然没有显示。那是声明它的正确位置/声明它的正确方式吗?
    • 嗨,Ben,您的声明看起来不错,应该可以。同时,我为示例配置编辑了帖子,效果很好。请查看它是否适合您,然后我们可以确定它是否确实只是配置问题。否则,问题可能出在其他地方。因为 Log4J 的创建方式是在出现问题时会静默失败,所以只能选择观察服务器日志文件中的警告/错误。
    【解决方案3】:

    在属性文件中添加阈值

    log4j.appender.default.file.threshold=INFO,DEBUG
    

    在java文件中

    例如:记录器 APPLICATION_LOGS = Logger.getLogger("rootLogger"); APPLICATION_LOGS.debug("开始"); 要么 APPLICATION_LOGS.info("开始");有效。

    【讨论】:

      猜你喜欢
      • 2017-08-27
      • 1970-01-01
      • 2011-03-23
      • 2017-06-10
      • 1970-01-01
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      • 2014-02-14
      相关资源
      最近更新 更多