Đăng nhập để ghi lại các thông điệp khác nhau vào hai tệp


146

Tôi đang sử dụng logback / slf4j để đăng nhập. Tôi muốn phân tích tệp nhật ký của mình để phân tích một số dữ liệu, vì vậy thay vì phân tích một tệp lớn tuyệt vời (chủ yếu bao gồm các câu lệnh gỡ lỗi) Tôi muốn có hai bản ghi nhật ký mà mỗi bản ghi vào một tệp riêng biệt; một cho phân tích và một cho tất cả các mục đích đăng nhập. Có ai biết nếu điều này là có thể với Logback, hoặc bất kỳ logger nào khác cho vấn đề đó không?

Câu trả lời:


296

Rất có thể làm một cái gì đó như thế này trong logback. Đây là một cấu hình ví dụ:

<?xml version="1.0"?>
<configuration>
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>logfile.log</file>
        <append>true</append>
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
        </encoder>
    </appender>
    <appender name="ANALYTICS-FILE" class="ch.qos.logback.core.FileAppender">
        <file>analytics.log</file>
        <append>true</append>
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
        </encoder>
    </appender>
    <!-- additivity=false ensures analytics data only goes to the analytics log -->
    <logger name="analytics" level="DEBUG" additivity="false">
        <appender-ref ref="ANALYTICS-FILE"/>
    </logger>
    <root>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

Sau đó, bạn sẽ thiết lập hai trình ghi nhật ký riêng biệt, một cho mọi thứ và một để ghi dữ liệu phân tích như vậy:

Logger analytics = LoggerFactory.getLogger("analytics");

1
Tôi cần phải làm điều này để tôi có thể có một ứng dụng không có nguồn cấp dữ liệu và một ứng dụng thông thường cho cùng một tệp. Cảm ơn thông tin này.
djangofan

IMO addergy = false nên được mặc định nếu các app-ref khác nhau được chỉ định. Rất thường xuyên chúng tôi nhận được ứng dụng trong đó một số mô-đun sẽ là trình tạo nhật ký rất thường xuyên do một số sự kiện hẹn giờ và chúng tôi muốn tách các nhật ký đó thành các tệp khác nhau. Đăng nhập cùng một nhật ký trong 10 tệp khác nhau thực sự không có ý nghĩa. Vì vậy, nó phải là một lựa chọn trong tính năng không mặc định. Vì logback là viết lại cùng một lỗi nên đã được sửa bởi cùng một tác giả.
samarjit samanta

Tôi muốn đăng nhập lỗi, gỡ lỗi, thông báo thông báo trong các tệp khác nhau tương ứng. Có thể với logback.xml
Qasim

@Qasim - điều đó là có thể. Xem - amitstechblog.wordpress.com/2014/09/27/ Kẻ
Andy Dufresne

Tôi đang cố gắng ghi nhật ký từ các gói khác nhau vào các tệp khác nhau như câu trả lời này gợi ý nhưng điều đó không hiệu quả với tôi. Trích xuất xml logback của tôi ở đây - pastebin.com/Aii4f1Jk . Tôi đang cố gắng ghi nhật ký gói ngủ đông cấp độ nhật ký TRACE vào một tệp khác. Bất kỳ đề xuất?
Andy Dufresne

7

Bạn có thể có nhiều loggers như bạn muốn. Nhưng, tốt hơn là bạn có một gói cho mỗi gói mà bạn cần phải đăng nhập khác nhau. Sau đó, tất cả các lớp trong gói đó và các gói phụ của nó sẽ nhận được bộ ghi nhật ký cụ thể đó. Tất cả họ đều có thể chia sẻ bộ ghi nhật ký gốc và gửi dữ liệu nhật ký của mình đến trình ghi nhật ký gốc bằng cách sử dụng addergy = "true". Đây là một ví dụ:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

<property name="pattern" value="%date{HH:mm:ss.SSS} %-5p %logger{36} 
%X{akkaSource} [%file:%line] - %m%n" />

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%date{HH:mm:ss.SSS} %-5p %logger{36} %X{akkaSource} [%file:%line] - %m%n</pattern>
    </encoder>
</appender>

<appender name="abc" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${catalina.base}/logs/worker.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${catalina.base}/logs/worker-%d{yyyy-MM-dd_HH}.log</fileNamePattern>
        <maxHistory>360</maxHistory>
    </rollingPolicy>
    <encoder>
        <pattern>${pattern}</pattern>
    </encoder>
</appender>

<appender name="xyz" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${catalina.base}/logs/transformer.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${catalina.base}/logs/transformer-%d{yyyy-MM-dd_HH}.log</fileNamePattern>
        <maxHistory>360</maxHistory>
    </rollingPolicy>
    <encoder>
        <pattern>${pattern}</pattern>
    </encoder>
</appender>

<logger name="com.xxx.yyy.zzz" level="INFO" additivity="true">
    <appender-ref ref="xyz"/>
</logger>

<logger name="com.aaa.bbb.ccc" level="INFO" additivity="true">
    <appender-ref ref="abc"/>
</logger>

<root>
    <level value="INFO" />
    <appender-ref ref="STDOUT" />
</root>


2

trong trường hợp của tôi, tôi muốn để lại tên lớp làm tên đăng nhập

private static final Logger log = LoggerFactory.getLogger(ScheduledPost.class);

và vì tôi có vài lớp như vậy, nên tôi logback.xml

<!--additivity=false ensures this log data only goes to the this log, and no one more -->
<logger name="xxx.xxx.xxx.ScheduledPost" level="DEBUG" additivity="false">
    <appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/>
</logger>
<logger name="xxx.xxx.xxx.GcmPost" level="DEBUG" additivity="false">
    <appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/>
</logger>
<logger name="xxx.xxx.xxx.PushUtils" level="DEBUG" additivity="false">
    <appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/>
</logger>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.