2013-07-12 2 views
1

Итак, я создал пользовательский appender для Log4J, который по сути делает то же самое, что и socketappender, но с UDP, в отличие от TCP. Однако я не могу заставить журнал отображать дату. Я думаю, что может быть проблема с файлом .properties, но я не уверен, что. Тем более, что я знаю, что файл .properties работает в некоторой степени, потому что именно так программа тестирования знает, какой appender использовать. Однако он не использует макет, указанный в файле .properties. Любая помощь/предложения будут очень признательны!Log4j Пользовательские свойства Appender File Issue

Appender код:

import java.io.IOException; 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 
import java.net.SocketException; 
import java.net.UnknownHostException; 

import org.apache.log4j.AppenderSkeleton; 

import org.apache.log4j.spi.LoggingEvent; 


public /*static*/ class UDPAppender extends AppenderSkeleton { 

    @Override 
protected void append(LoggingEvent event) { 
     String message = null; 
      event.getProperties(); 
      StringBuilder formatedMessage = new StringBuilder(); 
      formatedMessage.append("Level:"); 
      formatedMessage.append(event.getLevel()); 
      formatedMessage.append(", FILE:"); 
      formatedMessage.append(event.getLocationInformation().getFileName()); 
      formatedMessage.append(", Thread Id:"); 
      formatedMessage.append(event.getLocationInformation().getLineNumber()); 
      formatedMessage.append(", ERROR: "); 
      formatedMessage.append(event.getMessage().toString()); 
      message = formatedMessage.toString(); 
      DatagramSocket clientSocket = null; 
      //creating DatagramSocket to send logger info to socket; if not created, will print Stack Trace 
      try { 
       clientSocket = new DatagramSocket(); 
      } catch (SocketException e) { 
       e.printStackTrace(); 
      } 
      InetAddress IPAddress = null; 
      //get InetAddress for sending packet 
      try { 
       IPAddress = InetAddress.getByName("localhost"); 
      } catch (UnknownHostException e) { 
       e.printStackTrace(); 
      } 
      byte[] sendData = new byte[1024]; 

      sendData = message.getBytes(); //convert from String to bytes so that message can be sent through datagrampacket 
      DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 27770); //address packet 
      try { 
       clientSocket.send(sendPacket); //send packet to the socket addressed above 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      clientSocket.close(); //need to close 
} 

public void close()  { 
} 

public boolean requiresLayout() { 
    return true; 
} 



} 

Код испытания:

import org.apache.log4j.*; 
public class Tester { 
private static final Logger log2 = Logger.getLogger("REMOTE"); 

public static void main(String[] args) { 
    //configures using the .properties file user creates 
    PropertyConfigurator.configure("log4j.properties"); 
    log2.info("This is info message"); 
    System.out.println("Logging complete"); 
    //prints to console to let user know logging completed successfully 
    LogManager.shutdown(); 
    //closes logs once logging is complete 
    } 
} 

.properties файл:

log4j.logger.REMOTE=DEBUG, REMOTE 
log4j.appender.REMOTE=custom.UDPAppender 
log4j.appender.REMOTE.layout=org.apache.log4j.PatternLayout 
log4j.appender.REMOTE.layout.ConversionPattern=%d{MMMM dd HH:mm:ss}, %d{yyyy} %F %L %m %t 

ответ

0

я был фактически в состоянии просто преобразовать штамп времени в день/время, с следующий код:

long date = event.getTimeStamp(); 
Date dateObj = new Date(date); 
DateFormat df = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss"); 
StringBuilder formatedMessage = new StringBuilder(); 
      formatedMessage.append("Time:"); 
      formatedMessage.append(df.format(dateObj)); 
Смежные вопросы