<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Java Log4j 教程 原文:http://zetcode.com/java/log4j/ Java Log4j 教程定義了日志記錄,介紹了 Log4j 庫,并在幾個代碼示例中演示了日志記錄。 ## 日志記錄 日志記錄是將信息寫入日志文件的過程。 日志文件包含有關在操作系統,軟件或通信中發生的各種事件的信息。 ## 記錄目的 完成記錄是出于以下目的: * 故障排除 * 信息收集 * 性能分析 * 審計 * 產生統計數據 記錄不僅限于識別軟件開發中的錯誤。 它還可用于檢測安全事件,監視策略違規,在出現問題時提供信息,查找應用瓶頸或生成使用情況數據。 ## 要記錄哪些事件 應記錄的事件包括輸入驗證失敗,認證和授權失敗,應用錯誤,配置更改以及應用啟動和關閉。 ## 哪些事件不記錄 不應記錄的事件包括應用源代碼,會話標識值,訪問令牌,敏感的個人數據,密碼,數據庫連接字符串,加密密鑰,銀行帳戶和持卡人數據。 ## 記錄最佳做法 以下是進行日志記錄的一些最佳做法: * 日志記錄應該有意義。 * 日志記錄應在不同級別進行結構化和完成。 * 日志應包含上下文。 * 日志消息應該是人類所無法理解的,并且可以被機器解析。 * 日志應保持平衡; 它不應包含過多或過多的信息。 * 日志應適應開發和生產。 * 記錄更復雜的應用應產生幾個日志文件。 ## Log4j Apache Log4j 是基于 Java 的日志記錄工具。 它是 Apache Software Foundation 的項目。 可以通過 Java 代碼或在配置文件中配置 Log4j。 配置文件可以 XML,JSON,YAML 或屬性文件格式編寫。 ## Log4j 組件 Log4j 具有三個主要組件:記錄器,附加器和布局。 記錄器被命名為目標,可捕獲捕獲日志消息并將其發送到附加程序。 附加器將日志消息傳遞到其目的地,例如文件,套接字或控制臺。 布局用于定義日志消息的格式。 ## 根記錄器 Log4j 具有一個特定的內置記錄器,稱為“根查詢器”。 它位于層次結構的頂部,即使未配置,也始終存在。 它為應用中的所有類編寫消息。 如果我們不希望將來自特定記錄器的消息傳遞到根記錄器,則將發信人的`additivity`屬性更改為`false`。 ## 包特定的日志記錄 我們可能希望將日志記錄限制為某些 Java 包。 在進行 XML 配置的情況下,我們使用`name`屬性設置特定于包的日志記錄。 ```java <Logger name="com.zetcode.work" level="info" additivity="false" > <AppenderRef ref="MyFile" /> </Logger> ``` 使用此記錄器,我們將信息級別的事件消息從`com.zetcode.work`包傳遞到日志文件的目標位置。 將`additivity`設置為`false`時,消息不會傳播到根記錄器。 ## Log4j 事件級別 級別用于標識事件的嚴重性。 級別按從最具體到最不具體的順序進行組織: * `OFF` - 最具體,不記錄 * `FATAL` - 嚴重錯誤,將阻止應用繼續; 非常具體,數據很少 * `ERROR` - 嚴重錯誤,可能可以恢復 * `WARN` - 可能有害的消息 * `INFO` - 信息性消息 * `DEBUG` - 常規調試事件 * `TRACE` - 細粒度的調試消息,通常捕獲通過應用的流; 不太具體,很多數據 * `ALL` - 最不具體,所有數據 下表顯示了日志記錄級別的工作方式。 | 事件級別 | 配置級別 | | --- | --- | --- | --- | --- | --- | --- | --- | | `ALL` | `TRACE` | `DEBUG` | `INFO` | `WARN` | `ERROR` | `FATAL` | `OFF` | | `ALL` | YES | YES | YES | YES | YES | YES | YES | | | `TRACE` | YES | YES | NO | NO | NO | NO | NO | NO | | `DEBUG` | YES | YES | YES | NO | NO | NO | NO | NO | | `INFO` | YES | YES | YES | YES | NO | NO | NO | NO | | `WARN` | YES | YES | YES | YES | YES | NO | NO | NO | | `ERROR` | YES | YES | YES | YES | YES | YES | NO | NO | | `FATAL` | YES | YES | YES | YES | YES | YES | YES | NO | 該表說明了事件和配置級別的工作方式。 如果我們在調試級別記錄消息,并且配置為`WARN`,則不會傳遞該消息。 如果我們在信息級別記錄消息,而配置級別是調試,則消息將傳遞到其目的地。 ## Log4j 基本示例 在第一個示例中,我們為一個簡單的 Java 控制臺應用設置了 Log4j。 ```java $ tree . ├── pom.xml └── src ├── main │ ├── java │ │ └── com │ │ └── zetcode │ │ └── JavaLog4jEx.java │ └── resources │ └── log4j2.xml └── test └── java ``` 這是項目結構。 Log4j 配置文件位于`src/main/resources`目錄中。 我們使用 XML 格式。 `pom.xml` ```java <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zetcode</groupId> <artifactId>JavaLog4jEx</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.9.1</version> </dependency> </dependencies> </project> ``` 這是 Maven `pom.xml`文件。 我們包括`log4j-core`依賴項。 `JavaLog4jEx.java` ```java package com.zetcode; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class JavaLog4jEx { private static final Logger logger = LogManager.getLogger(JavaLog4jEx.class); public static void main(String[] args) { logger.info("The main() method is called"); doWork(); logger.warn("Warning message"); logger.error("Error message"); } public static void doWork() { // doing some work logger.info("The doWork() method is called"); } } ``` 這是一個簡單的 Java 控制臺示例。 ```java import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; ``` 我們導入`LogManager`和`Logger`類。 ```java private static final Logger logger = LogManager.getLogger(JavaLog4jEx.class); ``` 從`LogManager`中,我們得到記錄器。 ```java logger.info("The main() method is called"); doWork(); logger.warn("Warning message"); logger.error("Error message"); ``` 我們生成信息,警告和錯誤消息。 `log4j2.xml` ```java <?xml version="1.0" encoding="utf-8"?> <Configuration status="info"> <Properties> <Property name="layout">%d [%t] %-5level %logger - %m%n</Property> </Properties> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="${layout}" /> </Console> </Appenders> <Loggers> <Logger name="com.zetcode" level="info" additivity="false" > <AppenderRef ref="Console" /> </Logger> <Root level="error"> <AppenderRef ref="Console" /> </Root> </Loggers> </Configuration> ``` 在`log4j2.xml`中配置 Log4j。 我們選擇了 XML 文件格式。 ```java <Properties> <Property name="layout">%d [%t] %-5level %logger - %m%n</Property> </Properties> ``` 在`Properties`標記中,我們設置了日志目錄和布局。 布局定義了日志消息的格式。 模式布局由轉換說明符組成。 每個說明符均以百分號開頭,后跟可選的格式修飾符和強制轉換字符。 `%d`輸出記錄事件的日期。 `%t`輸出生成日志事件的線程的名稱。 `%-5level`輸出記錄事件的級別,級別名稱中至少要包含五個字符,并且這些字符必須對齊。 `%logger`輸出發布了記錄事件的記錄器的名稱。 `%m`打印與日志記錄事件關聯的應用消息,`%n`是平臺相關的行分隔符或多個字符。 ```java <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="${layout}" /> </Console> </Appenders> ``` 附加項是定義日志記錄消息發送位置的對象。 我們定義一個控制臺附加程序; 它使用上述布局將消息寫到標準輸出。 ```java <Loggers> <Logger name="com.zetcode" level="info" additivity="false" > <AppenderRef ref="Console" /> </Logger> <Root level="error"> <AppenderRef ref="Console" /> </Root> </Loggers> ``` 我們有兩個記錄器。 `com.zetcode`記錄器具有級別信息,而根記錄器具有級別錯誤。 兩個記錄器都使用控制臺附加程序,例如他們將消息傳遞到控制臺。 將`additivity`設置為`false`時,`com.zetcode's`消息不會傳播到根記錄器。 換句話說,消息不會兩次打印到控制臺。 ```java 2017-11-17 15:17:36,899 [main] INFO com.zetcode.JavaLog4jEx - The main() method is called 2017-11-17 15:17:36,903 [main] INFO com.zetcode.JavaLog4jEx - The doWork() method is called 2017-11-17 15:17:36,903 [main] WARN com.zetcode.JavaLog4jEx - Warning message 2017-11-17 15:17:36,903 [main] ERROR com.zetcode.JavaLog4jEx - Error message ``` 運行示例后,控制臺中將包含這些消息。 ## Log4j 基本示例 II 在下一個示例中,我們將說明 Log4j 的其他功能。 我們將消息寫入文件并定義特定于包的記錄器。 ```java $ tree . ├── pom.xml └── src ├── main │ ├── java │ │ └── com │ │ └── zetcode │ │ ├── main │ │ │ └── JavaLog4jEx.java │ │ └── work │ │ └── MyWork.java │ └── resources │ └── log4j2.xml └── test └── java ``` 這是項目結構。 `pom.xml` ```java <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zetcode</groupId> <artifactId>JavaLog4jEx2</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.9.1</version> </dependency> </dependencies> <name>JavaLog4jEx2</name> </project> ``` 這是`pom.xml`文件。 `JavaLog4jEx2.java` ```java package com.zetcode.main; import com.zetcode.work.MyWork; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class JavaLog4jEx2 { private static final Logger logger = LogManager.getLogger(JavaLog4jEx2.class); public static void main(String[] args) { logger.info("The main() method is called"); doJob(); MyWork mw = new MyWork(); mw.doMyWork(); } public static void doJob() { // doing some job logger.info("The doJob() method is called"); } } ``` 這是主應用文件。 它調用了一些做一些日志記錄的方法。 `MyWork.java` ```java package com.zetcode.work; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class MyWork { private static final Logger logger = LogManager.getLogger(MyWork.class); public void doMyWork() { // doing some work logger.info("doMyWork() method called"); } } ``` 我們有一個簡單的方法來記錄一條信息消息。 其類在`com.zetcode.work`包中。 我們定義了一個記錄器,它將僅記錄來自此包的消息。 `log4j2.xml` ```java <?xml version="1.0" encoding="utf-8"?> <Configuration status="info"> <Properties> <Property name="layout">%d [%t] %-5level %logger{36} - %m%n</Property> </Properties> <Appenders> <Console name="Console"> <PatternLayout pattern="${layout}" /> </Console> <File name="MyFile" fileName="/home/janbodnar/tmp/mylog.log" append="false"> <PatternLayout pattern="${layout}"/> </File> </Appenders> <Loggers> <Logger name="com.zetcode.work" level="info" additivity="false" > <AppenderRef ref="MyFile" /> </Logger> <Root level="info"> <AppenderRef ref="Console" /> </Root> </Loggers> </Configuration> ``` 在`log4j2.xml`配置文件中,我們定義了兩個附加器和兩個記錄器。 ```java <File name="MyFile" fileName="/home/janbodnar/tmp/mylog.log" append="false"> <PatternLayout pattern="${layout}"/> </File> ``` 我們定義了一個文件附加器,它將日志消息寫入指定的文件。 文件名由`fileName`屬性指定。 將`append`屬性設置為`false`時,該文件將始終被覆蓋。 ```java <Logger name="com.zetcode.work" level="info" additivity="false" > <AppenderRef ref="MyFile" /> </Logger> ``` 我們定義了一個記錄器,用于記錄來自`com.zetcode.work`包的信息消息。 記錄器將消息寫入文件。 ```java <Root level="info"> <AppenderRef ref="Console" /> </Root> ``` 其余消息(在我們的情況下為`com.zetcode.main`包中的消息)由根記錄器處理。 ```java 2017-11-17 15:35:22,718 [main] INFO com.zetcode.main.JavaLog4jEx2 - The main() method is called 2017-11-17 15:35:22,721 [main] INFO com.zetcode.main.JavaLog4jEx2 - The doJob() method is called ``` 這兩個消息已寫入控制臺。 ```java $ cat mylog.log 2017-11-17 15:35:22,722 [main] INFO com.zetcode.work.MyWork - doMyWork() method called ``` 此消息已寫入`mylog.log`文件。 ## Log4j `RollingFileAppender` `RollingFileAppender`是一種特殊類型的附加程序,可在日志文件達到一定大小或符合時間標準時備份它們。 滾動文件附加器會自動滾動或歸檔當前日志文件,并繼續記錄新文件。 以下應用使用`RollingFileAppender`。 ```java $ tree . ├── pom.xml └── src └── main ├── java │ └── com │ └── zetcode │ └── JavaLog4jRollingFileEx.java └── resources └── log4j2.xml ``` 這是項目結構。 `pom.xml` ```java <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zetcode</groupId> <artifactId>JavaLog4jRollingFileEx</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.9.1</version> </dependency> </dependencies> </project> ``` 這是`pom.xml`文件,其中包含`log4j-core`依賴項。 `JavaLog4jRollingFileEx.java` ```java package com.zetcode; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class JavaLog4jRollingFileEx { private static final Logger logger = LogManager.getLogger( JavaLog4jRollingFileEx.class); public static void main(String[] args) { logger.info("Information message"); logger.warn("Warning message"); logger.error("Error message"); } } ``` 在`JavaLog4jRollingFileEx`類中,我們記錄了三個消息。 `log4j2.xml` ```java <?xml version="1.0" encoding="utf-8"?> <Configuration status="info"> <Properties> <Property name="logdir">/home/janbodnar/tmp</Property> <Property name="layout">%d [%t] %-5level %logger{36} - %m%n</Property> </Properties> <Appenders> <Console name="Console"> <PatternLayout pattern="${layout}" /> </Console> <RollingFile name="MyFile" fileName="${logdir}/app.log" filePattern="${logdir}/app.%d{yyyy-MM-dd}-%i.log"> <PatternLayout pattern="${layout}" /> <Policies> <TimeBasedTriggeringPolicy /> <SizeBasedTriggeringPolicy size="1 MB" /> </Policies> <DefaultRolloverStrategy max="10" /> </RollingFile> </Appenders> <Loggers> <Logger name="com.zetcode" level="info" additivity="false"> <AppenderRef ref="MyFile" /> </Logger> <Root level="error"> <AppenderRef ref="Console" /> </Root> </Loggers> </Configuration> ``` 在`log4j2.xml`中配置 Log4j。 ```java <RollingFile name="MyFile" fileName="${logdir}/app.log" filePattern="${logdir}/app.%d{yyyy-MM-dd}-%i.log"> <PatternLayout pattern="${layout}" /> ... <DefaultRolloverStrategy max="10" /> </RollingFile> ``` 使用`RollingFile`標簽創建滾動文件附加程序。 我們使用`fileName`屬性設置日志文件的位置。 `PatternLayout`設置日志消息的布局。 如果存檔數量達到十個,`DefaultRolloverStrategy`將刪除較舊的存檔。 ```java <Policies> <TimeBasedTriggeringPolicy /> <SizeBasedTriggeringPolicy size="1 MB" /> </Policies> ``` 觸發策略在`Policies`標記中定義。 它們控制發生翻轉的條件。 在這里,我們使用兩個策略:`TimeBasedTriggeringPolicy`和`SizeBasedTriggeringPolicy`。 `TimeBasedTriggeringPolicy`根據最具體的日期和時間模式開始翻轉; 就我們而言,如果每小時日志文件的大小達到 1 MB,則`SizeBasedTriggeringPolicy`開始翻轉。 ```java <Loggers> <Logger name="com.zetcode" level="info" additivity="false"> <AppenderRef ref="MyFile" /> </Logger> <Root level="error"> <AppenderRef ref="Console" /> </Root> </Loggers> ``` 我們定義了兩個記錄器。 `com.zetcode`記錄器登錄到文件附加器。 根記錄器未在此應用中使用。 ```java $ cat app.log 2017-11-17 16:44:14,251 [main] INFO com.zetcode.JavaLog4jRollingFileEx - Information message 2017-11-17 16:44:14,254 [main] WARN com.zetcode.JavaLog4jRollingFileEx - Warning message 2017-11-17 16:44:14,255 [main] ERROR com.zetcode.JavaLog4jRollingFileEx - Error message 2017-11-17 16:44:28,158 [main] INFO com.zetcode.JavaLog4jRollingFileEx - Information message 2017-11-17 16:44:28,160 [main] WARN com.zetcode.JavaLog4jRollingFileEx - Warning message 2017-11-17 16:44:28,161 [main] ERROR com.zetcode.JavaLog4jRollingFileEx - Error message 2017-11-17 18:11:58,189 [main] INFO com.zetcode.JavaLog4jRollingFileEx - Information message 2017-11-17 18:11:58,207 [main] WARN com.zetcode.JavaLog4jRollingFileEx - Warning message 2017-11-17 18:11:58,208 [main] ERROR com.zetcode.JavaLog4jRollingFileEx - Error message ``` 這是日志文件的示例輸出。 ## 使用 Spring Boot 的 Log4j 下一個示例顯示了如何在 Spring Boot 應用中使用 Log4j。 該應用是控制臺 Java 程序。 Spring Boot 默認使用 Logback 進行日志記錄。 因此,我們需要配置 Spring Boot 以排除 Logback 并包含 Log4j。 常規日志設置在`application.properties`文件中設置。 要配置日志系統的更細粒度的設置,我們需要使用本機配置格式。 在本例中,為 Log4j 的設置。 ```java $ tree . ├── pom.xml └── src ├── main │ ├── java │ │ └── com │ │ └── zetcode │ │ ├── Application.java │ │ └── MyRunner.java │ └── resources │ ├── app.log │ └── log4j2.xml └── test └── java ``` 這是項目結構。 日志消息將寫入`app.log`文件。 `pom.xml` ```java <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zetcode</groupId> <artifactId>JavaLog4jSpringBootEx</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> ``` 在`pom.xml`文件中,我們排除了`spring-boot-starter-logging`依賴項,并添加了`spring-boot-starter-log4j2`依賴項。 `log4j2.xml` ```java <?xml version="1.0" encoding="utf-8"?> <Configuration status="info"> <Properties> <Property name="layout">%d [%t] %-5level %logger{36} - %m%n</Property> </Properties> <Appenders> <Console name="Console"> <PatternLayout pattern="${layout}" /> </Console> <File name="MyFile" fileName="src/main/resources/app.log"> <PatternLayout pattern="${layout}" /> </File> </Appenders> <Loggers> <Logger name="com.zetcode" level="info" additivity="false" > <AppenderRef ref="MyFile" /> </Logger> <Root level="error"> <AppenderRef ref="Console" /> </Root> </Loggers> </Configuration> ``` Spring Boot 在`src/main/resources`目錄中找到`log4j2.xml`配置文件。 ```java <File name="MyFile" fileName="src/main/resources/app.log"> <PatternLayout pattern="${layout}" /> </File> ``` 日志消息將寫入`src/main/resources/app.log`文件。 `MyRunner.java` ```java package com.zetcode; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; @Component public class MyRunner implements CommandLineRunner { private static final Logger logger = LogManager.getLogger(MyRunner.class); @Override public void run(String... args) throws Exception { logger.info("Information message"); logger.warn("Warning message"); } } ``` 這是我們的命令行運行程序。 `run()`方法生成信息和警告消息。 `Application.java` ```java package com.zetcode; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 在`Application`類中,我們設置了 Spring Boot 應用。 在本教程中,我們使用了 Log4j 庫。 您可能也對相關教程感興趣: [Java servlet Log4j 教程](/articles/javaservletlog4j/), [Java 教程](/lang/java/),[用 Java 閱讀文本文件](/articles/javareadtext/)和[Java 讀寫 ICO 圖片](/articles/javaico/)。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看