簡體   English   中英

logback-daemon 線程是如何自動創建的?

[英]How does logback- daemon threads get created automatically?

我試圖更多地理解logback ,我寫了一個非常簡單的獨立 Java 應用程序 - 你好世界:

package com.example;

import java.io.IOException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.core.util.StatusPrinter;

public class Slf4jApp1 {

    private static final Logger LOGGER = LoggerFactory.getLogger(Slf4jApp1.class);

    public static void main(String[] args) throws InterruptedException, IOException {

        LOGGER.info("Hello World");
        for (;;)
            ;
    }
}

下面是logback.xml


<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds">

    <appender name="STDOUT"
        class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- %d{yyyy-MM-dd HH:mm:ss.SSS} %thread %-5level %logger{0}:%L 
                If you required class name ,enable %logger{0}:%L -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %thread %-5level - %msg
                %n</pattern>
        </encoder>
    </appender>


    <appender name="FILE"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>/Users/user1/eclipse-workspace/logback-learning/log-file.log
        </file>
        <append>true</append>
        <rollingPolicy
            class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            
            <fileNamePattern>/Users/user1/eclipse-workspace/logback-learning/log-file.%d{yyyy-MM-dd_HH}.log
            </fileNamePattern>
            
            <maxHistory>240</maxHistory>
        </rollingPolicy>
        <encoder>
          
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %thread %-5level
                %logger{0} %L - %msg%n </pattern>
        </encoder>
    </appender>


    <appender name="ASYNC-STDOUT"
        class="ch.qos.logback.classic.AsyncAppender">
        <queueSize>0</queueSize>
        <discardingThreshold>1</discardingThreshold>
        <neverBlock>true</neverBlock>
        <appender-ref ref="STDOUT" />
    </appender>

    <root level="INFO">
        <appender-ref ref="ASYNC-STDOUT" />
        <appender-ref ref="FILE" />
    </root>
</configuration>

當我運行它時; 我看到以下線程轉儲(片段):


"logback-1" #13 daemon prio=5 os_prio=31 tid=0x00007fd01d93a800 nid=0xa603 waiting on condition [0x00007000071c7000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x0000000797600730> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)




"main" #1 prio=5 os_prio=31 tid=0x00007fd01d00f800 nid=0x1803 runnable [0x0000700005b85000]
   java.lang.Thread.State: RUNNABLE
        at com.example.Slf4jApp1.<clinit>(Slf4jApp1.java:13)

我調試它並在第一條語句上打斷點:

private static final Logger LOGGER = LoggerFactory.getLogger(Slf4jApp1.class);

我無法理解logback-1線程是如何產生的,它是否只是在 pom.xml 中具有 maven 依賴關系而創建的? 另外,我沒有給出任何具體指令/JVM OPTS,那么新線程是如何產生的呢?

IntelliJ IDEA 中的字段斷點以這種方式工作。 把 LOGGER = LoggerFactory.getLogger(Slf4jApp1.class); 和 static 塊中的斷點,看看沒有 logback 線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM