可以使用socketappender解决多进程写问题。
server端代码:
- package log4j;
- import org.apache.log4j.Logger;
- import org.apache.log4j.net.SimpleSocketServer;
- public class Server{
- static Logger cat = Logger.getLogger(SimpleSocketServer.class);
- public static void main(String[] args){
- System.out.println("Accessing socket on localhost:6666");
- String[] g = {"6666", "test.properties"};
- SimpleSocketServer.main(g);
- }
- }
server端的配置文件test.properties:
log4j.rootLogger=debug,stdout,R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=remote_log.log
log4j.appender.R.MaxFileSize=1024KB
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
client端代码:
- package log4j;
- import org.apache.log4j.Level;
- import org.apache.log4j.Logger;
- import org.apache.log4j.PropertyConfigurator;
- import org.apache.log4j.net.SocketAppender;
- import org.apache.log4j.spi.LoggingEvent;
- public class Client1{
- static Logger logger = Logger.getRootLogger();
- public static void main(String argv[]) {
- // Try sending logging events through the SocketAppender in the log4j_remote.properties file
- System.out.println("Try sending logs through the SocketAppender in the log4j.properties file");
- PropertyConfigurator.configure("client.properties"); //Logs to a SocketAppender; host 127.0.0.1, port 4445
- logger.debug("Hello world");
- logger.info("What a beatiful day.");
- // And try sending logging events through SocketAppender instance
- System.out.println("Try sending logs through a SocketAppender instance");
- SocketAppender sa = new SocketAppender("localhost", 6666);
- System.out.println("Created SocketAppender instance");
- String logMsg = "Writing log event through SocketAppender instance";
- LoggingEvent le = new LoggingEvent("TestLog4J", Logger.getRootLogger(), Level.DEBUG, logMsg, new Throwable());
- sa.append(le);
- //sa.close();
- }
- }
client端的配置文件client.properties:
log4j.rootCategory=DEBUG,stdout,A1
# ConsoleAppender
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
# A1 is set to be a SocketAppender sending its output to the server running on the remote host, port 12345.
log4j.appender.A1=org.apache.log4j.net.SocketAppender
log4j.appender.A1.Port=6666
log4j.appender.A1.RemoteHost=localhost