Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何制作一个可以从不同包记录到不同文件的记录器_Java_Logging_Log4j2 - Fatal编程技术网

Java 如何制作一个可以从不同包记录到不同文件的记录器

Java 如何制作一个可以从不同包记录到不同文件的记录器,java,logging,log4j2,Java,Logging,Log4j2,因此,我使用Log4j2将我的应用程序中的信息记录到一些文件中,但要知道,我希望将文件按包分开。我有一个记录器,我不知道如何让他按包/类过滤日志/ <Logger name="hextodec.MainClass" additivity="FALSE"> <AppenderRef ref="info" level="INFO"/> <AppenderRef ref="error" level="ERROR"/>

因此,我使用Log4j2将我的应用程序中的信息记录到一些文件中,但要知道,我希望将文件按包分开。我有一个记录器,我不知道如何让他按包/类过滤日志/

<Logger name="hextodec.MainClass" additivity="FALSE">
        <AppenderRef ref="info"  level="INFO"/>
        <AppenderRef ref="error"  level="ERROR"/>
        <AppenderRef ref="stdout" level ="INFO" />
</Logger>

您可以通过创建多个文件附加器来实现这一点

示例:

追加器示例

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
    <File name="File" fileName="/var/log/file.log">
       <PatternLayout>
           <pattern>%d %p %C{1.} [%t] %m%n</pattern>
       </PatternLayout>
    </File>
  </Appenders>
  <Loggers>
    <Logger name="com.foo.Bar" level="trace">
      <AppenderRef ref="Console"/>
    </Logger>
    <Logger name="com.foo.acme" level="trace">
      <AppenderRef ref="File"/>
    </Logger>
    <Root level="error">
      <AppenderRef ref="Console"/>
    </Root>
  </Loggers>
</Configuration>

%d%p%C{1.}[%t]%m%n

嘿,这只是为您提供信息,为您的测试用例提供想法和实现:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="HIBERNATE_LOG_LOCATION" value="../logs/dev/hibernate" />
    <property name="HIBERNATE_ARCHIVE_LOG_LOCATION" value="../logs/dev/hibernate/archive" />

    <property name="SPRING_LOG_LOCATION" value="../logs/dev/spring" />
    <property name="SPRING_ARCHIVE_LOG_LOCATION" value="../logs/dev/spring/archive" />

<appender name="HIBERNATE_INFO"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${BASE_LOCATION}${HIBERNATE_LOG_LOCATION}/RERUN_UTIL_HIB_INFO.log</file>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- hourly rollover -->
            <fileNamePattern>${BASE_LOCATION}${HIBERNATE_ARCHIVE_LOG_LOCATION}/RERUN_UTIL_HIB_INFO.%d{yyyy-MM-dd_HH}.%i.log.gz
            </fileNamePattern>

            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- or whenever the file size reaches 100MB -->
                <maxFileSize>5MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>

            <!-- keep 30 days' worth of history -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>

        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

        <encoder>
            <!-- <pattern>%date %level [%thread] %logger{10} [%file : %line] %msg%n</pattern> -->
            <pattern>%date [%thread] %-5level %class [%M:%L] - %msg%n</pattern>
        </encoder>
    </appender>
    <!-- similar appenders for all others -->
<appender name="SP_INFO"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${BASE_LOCATION}${SPRING_LOG_LOCATION}/SPRING_INFO.log</file>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- hourly rollover -->
            <fileNamePattern>${BASE_LOCATION}${SPRING_ARCHIVE_LOG_LOCATION}/SPRING_INFO.%d{yyyy-MM-dd_HH}.%i.log.gz
            </fileNamePattern>

            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">

                <maxFileSize>5MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>


            <maxHistory>30</maxHistory>
        </rollingPolicy>

        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

        <encoder>

            <pattern>%date [%thread] %-5level %class [%M:%L] - %msg%n</pattern>
        </encoder>
    </appender>
    <!-- similar appenders for all others-->

<logger name="org.hibernate" additivity="false">
        <appender-ref ref="HIBERNATE_DEBUG" />
        <appender-ref ref="HIBERNATE_INFO" /> 
        <appender-ref ref="HIBERNATE_ERROR" />      
    </logger>

    <logger name="org.springframework" additivity="false">
        <appender-ref ref="SP_ERROR" />
        <appender-ref ref="SP_DEBUG" />     
        <appender-ref ref="SP_INFO" />
    </logger>

    <root level="ALL">
        <appender-ref ref="INFO" />
        <appender-ref ref="DEBUG" />
        <appender-ref ref="ERROR" />
    </root>

</configuration>

${BASE\u LOCATION}${HIBERNATE\u LOG\u LOCATION}/RERUN\u UTIL\u HIB\u INFO.LOG
${BASE\u LOCATION}${HIBERNATE\u ARCHIVE\u LOG\u LOCATION}/RERUN\u UTIL\u HIB\u INFO.%d{yyyy-MM-dd\u HH}.%i.LOG.gz
5MB
30
信息
接受
否认
%日期[%thread]-5级别%class[%M:%L]-%msg%n
${BASE\u LOCATION}${SPRING\u LOG\u LOCATION}/SPRING\u INFO.LOG
${BASE\u LOCATION}${SPRING\u ARCHIVE\u LOG\u LOCATION}/SPRING\u INFO.%d{yyyy-MM-dd\u HH}.%i.LOG.gz
5MB
30
信息
接受
否认
%日期[%thread]-5级别%class[%M:%L]-%msg%n

希望这能解决您的问题。

您可以为不同的包使用不同的appender,为相应的包指定每个appender ref
假设我有几个不同的appender,如果我从一个级别登录,记录器将如何区分软件包是的,没有问题。始终可供提问:):)如果我只想使用一个记录器怎么办?删除其他条目并保留所需的条目。在上面的示例中,删除
并使用它。这是一个Logback配置,但Log4j 2的等效配置将非常类似。