AbstractLog4JLogger.java
/*
* GovWay - A customizable API Gateway
* https://govway.org
*
* Copyright (c) 2005-2024 Link.it srl (https://link.it).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3, as published by
* the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openspcoop2.utils.logger.log4j;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.logging.log4j.Level;
import org.openspcoop2.utils.LoggerWrapperFactory;
import org.openspcoop2.utils.UtilsException;
import org.openspcoop2.utils.date.DateUtils;
import org.openspcoop2.utils.logger.AbstractBasicLogger;
import org.openspcoop2.utils.logger.IContext;
import org.openspcoop2.utils.logger.beans.Attachment;
import org.openspcoop2.utils.logger.beans.Diagnostic;
import org.openspcoop2.utils.logger.beans.Event;
import org.openspcoop2.utils.logger.beans.Message;
import org.openspcoop2.utils.logger.beans.Property;
import org.openspcoop2.utils.logger.config.DiagnosticConfig;
import org.openspcoop2.utils.logger.config.Log4jConfig;
import org.openspcoop2.utils.logger.constants.Severity;
import org.slf4j.Logger;
/**
* Log4JLogger
*
* @author Poli Andrea (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public abstract class AbstractLog4JLogger extends AbstractBasicLogger {
public AbstractLog4JLogger(DiagnosticConfig diagnosticConfig, Log4jConfig logConfig) throws UtilsException {
super(diagnosticConfig);
Log4jConfig.validate(logConfig);
Log4jConfig.setConfigurationLogger(logConfig);
this.logTransaction = LoggerWrapperFactory.getLogger("transaction");
if(this.logTransaction==null){
throw new UtilsException("Category [transaction] not found; expected in log4j configuration");
}
this.logDiagnostic = LoggerWrapperFactory.getLoggerImpl("diagnostic");
if(this.logDiagnostic==null){
throw new UtilsException("Category [diagnostic] not found; expected in log4j configuration");
}
this.logDump = LoggerWrapperFactory.getLogger("dump");
if(this.logDump==null){
throw new UtilsException("Category [dump] not found; expected in log4j configuration");
}
this.logEvent = LoggerWrapperFactory.getLogger("event");
if(this.logEvent==null){
throw new UtilsException("Category [event] not found; expected in log4j configuration");
}
}
protected Logger logTransaction;
protected org.apache.logging.log4j.Logger logDiagnostic;
protected Map<String, org.apache.logging.log4j.Logger> mapFunctionToLogDiagnostic = null;
protected Logger logDump;
protected Logger logEvent;
private synchronized void initLogFunctionToDiagnostic(){
if(this.mapFunctionToLogDiagnostic==null){
List<String> loggers = new ArrayList<>();
org.apache.logging.log4j.core.LoggerContext context = (org.apache.logging.log4j.core.LoggerContext) org.apache.logging.log4j.LogManager.getContext(false);
Iterator<String> it = context.getConfiguration().getLoggers().keySet().iterator();
while (it.hasNext()) {
String logger = (String) it.next();
loggers.add(logger);
}
this.mapFunctionToLogDiagnostic = new HashMap<String, org.apache.logging.log4j.Logger>();
List<String> functions = this.diagnosticManager.getFunctions();
if(functions!=null && !functions.isEmpty()) {
for (String function : functions) {
//System.out.println("FUNCTION ["+function+"] ");
if(loggers.contains("diagnostic."+function)){
//System.out.println("REGISTRO");
this.mapFunctionToLogDiagnostic.put(function, LoggerWrapperFactory.getLoggerImpl("diagnostic."+function));
}
}
}
}
}
private static Severity diagnosticSeverity = Severity.DEBUG_HIGH;
public static void setDiagnosticSeverity(Severity logSeverity) {
if(logSeverity!=null){
diagnosticSeverity = logSeverity;
}
}
private static boolean emitDiagnostic(Severity severity){
return severity.intValue() <= diagnosticSeverity.intValue();
}
private static Severity eventSeverity = Severity.DEBUG_HIGH;
public static void setEventSeverity(Severity logSeverity) {
if(logSeverity!=null){
eventSeverity = logSeverity;
}
}
private static boolean emitEvent(Severity severity){
return severity.intValue() <= eventSeverity.intValue();
}
@Override
public void log() throws UtilsException {
this.log(this.getContext());
}
@Override
public void log(IContext contextParam) throws UtilsException {
StringBuilder showContext = new StringBuilder();
showContext.append("<").append(this.getContext().getIdTransaction()).append(">\n");
this.logContext(contextParam, showContext);
this.logTransaction.info(showContext.toString());
}
protected abstract void logContext(IContext contextParam, StringBuilder showContext);
@Override
public void log(Event event) throws UtilsException {
StringBuilder out = new StringBuilder();
if(event.getSeverity()==null){
throw new UtilsException("Severity undefined");
}
if(emitEvent(event.getSeverity())==false){
return;
}
if(this.getContext().getIdTransaction()!=null){
out.append("<").append(this.getContext().getIdTransaction()).append(">");
out.append(" \n");
}
if(event.getDate()!=null){
SimpleDateFormat dateformat = DateUtils.getSimpleDateFormatMs();
out.append("Date:"+dateformat.format(event.getDate()));
out.append(" \n");
}
if(event.getSeverity()!=null){
out.append("Severity:"+event.getSeverity().name());
out.append(" \n");
}
if(event.getSource()!=null){
out.append("Source:"+event.getSource());
out.append(" \n");
}
if(event.getCode()!=null){
out.append("Code:"+event.getCode());
out.append(" \n");
}
if(event.getClusterId()!=null){
out.append("ClusterId:"+event.getClusterId());
out.append(" \n");
}
if(event.getDescription()!=null){
out.append("Description:"+event.getDescription());
out.append(" \n");
}
if(event.getCorrelationIdentifier()!=null){
out.append("CorrelationIdentifier:"+event.getCorrelationIdentifier());
out.append(" \n");
}
out.append("\n");
this.logEvent.info(out.toString());
}
@Override
public String getLogParam(String logParam) throws UtilsException {
//throw new UtilsException("Not Implemented");
return "DEMOValoreCallback";
}
protected abstract String getDomain(IContext contextParam);
protected abstract String getRequestIdentifier(IContext contextParam);
protected abstract String getResponseIdentifier(IContext contextParam);
protected abstract String getRequestCorrelationIdentifier(IContext contextParam);
protected abstract String getResponseCorrelationIdentifier(IContext contextParam);
protected abstract String getClient(IContext contextParam);
protected abstract String getClientPrincipal(IContext contextParam);
protected abstract String getFrom(IContext contextParam);
protected abstract String getTo(IContext contextParam);
protected abstract String getService(IContext contextParam);
protected abstract String getOperation(IContext contextParam);
@Override
protected void log(Diagnostic diagnostic, IContext context) throws UtilsException {
if(diagnostic.getSeverity()==null){
throw new UtilsException("Severity undefined");
}
if(emitDiagnostic(diagnostic.getSeverity())==false){
return;
}
StringBuilder showMsg = new StringBuilder();
if(diagnostic.getIdTransaction()!=null)
showMsg.append("<").append(diagnostic.getIdTransaction()).append(">");
if(diagnostic.getCode()!=null){
if(showMsg.length()>0){
showMsg.append(" ");
}
showMsg.append(diagnostic.getCode());
showMsg.append(" ");
}
if(this.getDomain(context)!=null){
showMsg.append(this.getDomain(context));
showMsg.append(".");
}
showMsg.append(diagnostic.getFunction());
showMsg.append(" <");
SimpleDateFormat dateformat = DateUtils.getSimpleDateFormatMs();
showMsg.append(dateformat.format(diagnostic.getDate()));
showMsg.append("> ");
showMsg.append("(");
showMsg.append(diagnostic.getSeverity().name());
showMsg.append(")");
String idRichiesta = this.getRequestIdentifier(context);
String idRisposta = this.getResponseIdentifier(context);
if(idRichiesta!=null){
showMsg.append(" [id-req:").append(idRichiesta).append("]");
}
if(idRisposta!=null){
showMsg.append(" [id-resp:").append(idRisposta).append("]");
}
String idCorrelazioneRichiesta = this.getRequestCorrelationIdentifier(context);
String idCorrelazioneRisposta = this.getResponseCorrelationIdentifier(context);
if(idCorrelazioneRichiesta!=null){
showMsg.append(" {correlation-req:").append(idCorrelazioneRichiesta).append("}");
}
if(idCorrelazioneRisposta!=null){
showMsg.append(" {correlation-resp:").append(idCorrelazioneRisposta).append("}");
}
String client = this.getClient(context);
String clientPrincipal = this.getClientPrincipal(context);
if(client!=null){
showMsg.append(" Client:"+client);
}
else if(clientPrincipal!=null){
showMsg.append(" Client-Principal:"+clientPrincipal);
}
String from = this.getFrom(context);
String to = this.getTo(context);
String service = this.getService(context);
String operation = this.getOperation(context);
if(from!=null){
showMsg.append(" From:");
showMsg.append(from);
}
if( from!=null && (service!=null || to!=null))
showMsg.append(" -> ");
if(to!=null){
showMsg.append(" To:");
showMsg.append(to);
}
if(service!=null){
showMsg.append(" S:");
showMsg.append(service);
}
if(operation!=null){
showMsg.append(" O:");
showMsg.append(operation);
}
showMsg.append("\n");
showMsg.append(diagnostic.getMessage());
showMsg.append("\n");
org.apache.logging.log4j.Logger log = this.logDiagnostic;
if(this.mapFunctionToLogDiagnostic==null){
this.initLogFunctionToDiagnostic();
}
if(this.mapFunctionToLogDiagnostic.containsKey(diagnostic.getFunction())){
log = this.mapFunctionToLogDiagnostic.get(diagnostic.getFunction());
}
log.log(this.convertToPriority(diagnostic.getSeverity()), showMsg.toString());
}
protected Level convertToPriority(Severity severity){
return SeverityLog4J.getSeverityLog4J(severity);
}
@Override
public void log(Message message) throws UtilsException {
StringBuilder out = new StringBuilder();
if(message.getIdTransaction()!=null){
out.append("<").append(message.getIdTransaction()).append(">");
out.append(" \n");
}
else if(this.getContext().getIdTransaction()!=null){
out.append("<").append(this.getContext().getIdTransaction()).append(">");
out.append(" \n");
}
if(message.getIdMessage()!=null){
out.append("IdMessage:"+message.getIdMessage());
out.append(" \n");
}
if(message.getIdServer()!=null){
out.append("IdServer:"+message.getIdServer());
out.append(" \n");
}
if(message.getIdOperation()!=null){
out.append("IdOperation:"+message.getIdOperation());
out.append(" \n");
}
if(message.getType()!=null){
out.append("Type:"+message.getType().name());
out.append(" \n");
}
if(message.getContentType()!=null){
out.append("Content-Type:"+message.getContentType());
out.append(" \n");
}
// HEADER
if(message.getHeaders()!=null && message.getHeaders().size()>0){
out.append("------ Header ------\n");
for (Property header : message.getHeadersAsList()) {
out.append(header.getName()+"="+header.getValue()+"\n");
}
}
// RESOURCES
if(message.getResources()!=null && message.getResources().size()>0){
out.append("------ Resource ------\n");
for (Property header : message.getResourcesAsList()) {
out.append(header.getName()+"="+header.getValue()+"\n");
}
}
// CONTENT
if(message.getContent()!=null){
out.append("------ Content ------\n");
out.append("Size:"+message.getContent().length+"\n");
// 1024 = 1K
// Visualizzo al massimo 250K
int max = 250 * 1024;
String text = null;
try{
text = org.openspcoop2.utils.Utilities.convertToPrintableText(message.getContent(),max);
}catch(Exception e){
text = e.getMessage();
}
out.append(text);
out.append("\n");
}
// ATTACH
if(message.getAttachments()!=null && message.getAttachments().size()>0){
for (Attachment attachment : message.getAttachments()) {
out.append("------ Attachment id["+attachment.getContentId()+"] ------\n");
if(attachment.getContentType()!=null){
out.append("Content-Type:"+attachment.getContentType());
out.append(" \n");
}
if(attachment.getContent()!=null){
out.append("Size:"+attachment.getContent().length+"\n");
// 1024 = 1K
// Visualizzo al massimo 250K
int max = 250 * 1024;
String text = null;
try{
text = org.openspcoop2.utils.Utilities.convertToPrintableText(attachment.getContent(),max);
}catch(Exception e){
text = e.getMessage();
}
out.append(text);
out.append("\n");
}
}
}
out.append("\n");
this.logDump.info(out.toString());
}
}