Môi trường: WebLogic 12,2 .1 Ghi nhật ký Khung: SLF4J và Logback Yêu cầu: Đăng nhập vào một tập tin lựa chọn của tôi (cho mỗi ứng dụng) cũng như các bản ghi máy chủ WebLogic
Sử dụng <prefer-application-packages/>
hoặc <prefer-web-inf-classes>
trong weblogic.xml đã không đáp ứng yêu cầu. Trong thử nghiệm của tôi, sử dụng một hoặc các thẻ khác (bạn không thể sử dụng cả hai) sẽ dẫn đến logback.xml ứng dụng được chọn và việc ghi nhật ký sẽ đi đến tệp được định nghĩa trong logback.xml. Tuy nhiên, sự phá hủy STDOUT điển hình bằng cách sử dụng ConsoleAppender của logback sẽ không đăng nhập vào nhật ký máy chủ.
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
Xóa thông tin sau khỏi weblogic.xml
<wls:prefer-application-packages>
<wls:package-name>org.slf4j.*</wls:package-name>
</wls:prefer-application-packages>
sẽ dẫn đến việc sử dụng liên kết SLF4j đi kèm, trong Weblogic 12.2.1, là ghi nhật ký Java Util. Trong trường hợp này, các báo cáo tường trình sẽ đi tới các nhật ký máy chủ và không đến định nghĩa tệp trong tệp logback.xml cấp ứng dụng. Trong nghiên cứu của tôi, nó xuất hiện cùng một lúc, một số phiên bản của Weblogic 12 cho phép SLF4j nội bộ bị ràng buộc với Log4j nhưng đã bị loại bỏ trong một trong các phiên bản nhỏ. Đây là trường hợp của tôi; Tôi không có tùy chọn bật Log4j làm Khung ghi nhật ký chính trong Weblogic thông qua Bảng điều khiển dành cho quản trị viên. Tôi khá chắc chắn điều này sẽ không giúp tôi, nhưng tôi đã muốn lưu ý nó bởi vì một số tài liệu tôi đọc chỉ ra điều này sẽ có sẵn.
Sau nhiều cấu hình nghiên cứu và chiến đấu với weblogic.xml, cấu hình POM (loại trừ vv) và cố gắng sử dụng các ràng buộc và cầu nối khác nhau, tôi không thể đạt được cấu hình ghi nhật ký mà tôi muốn. Có vẻ như slf4j của Weblogic bị ràng buộc với việc ghi nhật ký tiện ích Java, tốt hơn hoặc tệ hơn. Nếu bạn chọn thực hiện slf4j và ràng buộc của riêng bạn (trong trường hợp của tôi Logback), không có cách nào mà tôi có thể tìm thấy để định tuyến các thông điệp đó tới nhật ký máy chủ Weblogic thông qua cấu hình. Chỉ có một ràng buộc trong slf4j, và mặc dù nhiều khung công tác có thể được định tuyến tới một ràng buộc, (tôi thấy this sơ đồ hữu ích) Weblogic 12.2.1 chỉ sử dụng liên kết ghi nhật ký Java util, không có cách nào để (ở mức cấu hình ứng dụng) để nối Weblogic để sử dụng liên kết Logback mà bạn cung cấp để đăng nhập vào nhật ký máy chủ của nó. Có thể có một số cách để sử dụng log4j và bridge để thực hiện điều này, nhưng đối với tôi đó là quá nhiều bloat và cấu hình để thực hiện một nhiệm vụ đăng nhập đơn giản.
Từ bỏ việc cố gắng chinh phục điều này bằng cấu hình, tôi đã quyết định chỉ viết ứng dụng đăng nhập của riêng mình để dịch sự kiện ghi nhật ký thành sự kiện ghi nhật ký JUL. Tôi đã thay thế định nghĩa STDOUT chuẩn được thấy trong nhiều ví dụ về Logback với việc triển khai thực hiện own của Logback's AppenderBase. Tại thời điểm này tôi có thể đăng nhập bằng cách sử dụng mỗi cấu hình đăng nhập ứng dụng và cũng đăng nhập vào Nhật ký máy chủ Weblogic.
Dependencies POM liên quan:
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-core -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
weblogic.xml (Lưu ý ở đây rằng Hibernate đi kèm với JbossLogging mà sẽ là cầu nối để SLF4J tự động)
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app"
xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/2.0/weblogic-web-app.xsd">
<jsp-descriptor>
<keepgenerated>true</keepgenerated>
<debug>true</debug>
</jsp-descriptor>
<context-root>YourContextRoot</context-root>
<wls:container-descriptor>
<wls:prefer-application-packages>
<wls:package-name>ch.qos.logback.*</wls:package-name>
<wls:package-name>org.jboss.logging.*</wls:package-name>
<wls:package-name>org.slf4j.*</wls:package-name>
</wls:prefer-application-packages>
<wls:prefer-application-resources>
<wls:resource-name>org/slf4j/impl/StaticLoggerBinder.class</wls:resource-name>
</wls:prefer-application-resources>
</wls:container-descriptor>
Logback AppenderBase thực hiện
import java.util.logging.Logger;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;
public class WeblogicAppender extends AppenderBase<ILoggingEvent> {
private final Logger logger = Logger.getLogger(WeblogicAppender.class.getName());
ILoggingEvent event = null;
@Override
protected void append(ILoggingEvent event) {
this.event = event;
logger.log(getJULLevel(), event.getFormattedMessage());
}
private java.util.logging.Level getJULLevel() {
if (this.event == null) {
return java.util.logging.Level.SEVERE;
} else if (this.event.getLevel() == ch.qos.logback.classic.Level.ALL) {
return java.util.logging.Level.ALL;
} else if (this.event.getLevel() == ch.qos.logback.classic.Level.DEBUG) {
return java.util.logging.Level.FINE;
} else if (this.event.getLevel() == ch.qos.logback.classic.Level.ERROR) {
return java.util.logging.Level.SEVERE;
} else if (this.event.getLevel() == ch.qos.logback.classic.Level.INFO) {
return java.util.logging.Level.INFO;
} else if (this.event.getLevel() == ch.qos.logback.classic.Level.TRACE) {
return java.util.logging.Level.FINEST;
} else if (this.event.getLevel() == ch.qos.logback.classic.Level.WARN) {
return java.util.logging.Level.WARNING;
} else if (this.event.getLevel() == ch.qos.logback.classic.Level.OFF) {
return java.util.logging.Level.OFF;
} else {
return java.util.logging.Level.INFO;
}
}
}
cấu hình Logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="com.your.package.WeblogicAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger: LineNumber:%L - %message%n</pattern>
</encoder>
</appender>
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>yourlog.log
</file>
<rollingPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>yourlog.%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<maxFileSize>25MB</maxFileSize>
<maxHistory>60</maxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger: LineNumber:%L - %message%n</pattern>
</encoder>
</appender>
<root level="TRACE">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
Hy vọng rằng tôi có thể cứu người khác một số trong những nỗi đau mà tôi đã đi qua cố gắng để có được làm việc này theo cách tôi muốn.
Điều rất rõ ràng khi bạn giải thích cách thức và tệp nào cần được sử dụng. Cảm ơn bạn! – ferreirabraga