using System;
using Kreta.Framework.Exceptions;
using Kreta.Framework.Security;
namespace Kreta.Framework.Logging
{
///
/// A naplózható eseményeket kivezető osztály.
///
///
/// Célja, hogy tipizáltan egy helyre kivezesse az összes naplózandó
/// eseményt. Az osztály felelőssége, hogy a megfelelő naplóüzenetet
/// állítsa össze a naplózó számára.
///
public sealed class Logger
{
// <>
///
/// Naplózó segédobjektum
///
private ILogWriter m_LogWriter;
///
/// Az osztály konstruktora.
///
/// A naplózó, ahova dolgozik az objektum
public Logger(ILogWriter logWriter)
{
this.m_LogWriter = logWriter ?? throw new ArgumentNullException(nameof(logWriter));
}
///
/// A jelenleg használatos naplózó objektum.
///
public static Logger Current
{
get
{
return SDAServer.Instance.Logger;
}
}
///
/// A naplózó, ahova dolgozik az objektum.
///
public ILogWriter LogWriter
{
get
{
return m_LogWriter;
}
}
#region Belső dolgok
///
/// Elvégzi egy naplóüzenet naplóba kerülését
///
/// A naplózandó naplóüzenet
private Guid? Log(ILogMessage message)
{
if (message == null)
{
return null;
}
var logId = this.m_LogWriter.Log(message);
message.IsLogged = true;
return logId;
}
private static LogMessage CreateLogMessage(Events eventType, LogLevel logLevel)
{
// <>
return CreateLogMessage(eventType, logLevel, Guid.NewGuid().ToString());
}
private static LogMessage CreateLogMessage(Events eventType, LogLevel logLevel, string entryId)
{
// <>
LogMessage result = new LogMessage(entryId);
result.EventType = eventType;
result.Level = logLevel;
UserContext usercontext = UserContext.Instance;
if (usercontext != null)
{
result.UserId = usercontext.FelhasznaloId.ToString();
result.SessionId = usercontext.SessionID;
}
else
{
result.UserId = "";
}
return result;
}
#endregion
#region Egyéb események
///
/// Egyéb esemény történt.
///
/// Nem szabad használnunk!
public void GeneralEvent(LogLevel logLevel, string details)
{
LogMessage message = CreateLogMessage(Events.GENERAL, logLevel);
message.SetParameter(LogParameter.DETAILS, details);
this.Log(message);
}
///
/// Tetszőleges log esemény naplózása.
///
/// Esemény tipusa
/// LogLevel
/// Részletek
public void CustomEvent(Kreta.Framework.Events oEvent, LogLevel oLogLevel, string details)
{
LogMessage message = CreateLogMessage(oEvent, oLogLevel);
message.SetParameter(LogParameter.DETAILS, details);
this.Log(message);
}
///
/// Egy Neptun behívás történt.
///
public void NeptunConnectorEvent(string actionName, DateTime actionTime, string serverName)
{
LogMessage message = CreateLogMessage(Events.NEPTUN_CONNECTOR_EVENT, LogLevel.INFO);
message.SetParameter(LogParameter.DETAILS,
string.Format(
"A {0} nevű Neptun szerver {1}-kor egy {2} akciót indított.",
serverName,
actionTime,
actionName));
this.Log(message);
}
///
/// A kiszolgáló terheltségét lekérdezték.
///
/// A terheltség
public void ServerLoad(double serverLoad)
{
LogMessage message = CreateLogMessage(Events.FRAMEWORK_SERVERLOAD, LogLevel.INFO);
message.SetParameter(LogParameter.SERVERLOAD, serverLoad.ToString());
this.Log(message);
}
///
/// Hibás FDL szűrő.
///
/// A szűrőben definiált SQL töredék.
public void BadFDL(string sqlText)
{
LogMessage message = CreateLogMessage(Events.FDL_BAD_FILTER, LogLevel.WARNING);
message.SetParameter(LogParameter.SQLTEXT, sqlText);
this.Log(message);
}
#endregion
#region Kiszolgáló eseményei
///
/// A konfiguráció sikeresen betöltődött.
///
public void ConfigurationLoaded()
{
LogMessage message = CreateLogMessage(Events.FRAMEWORK_CONFIGLOADED, LogLevel.DEBUG);
this.Log(message);
}
///
/// A kiszolgáló elindult.
///
public void ServerStarted()
{
LogMessage message = CreateLogMessage(Events.FRAMEWORK_SERVERSTART, LogLevel.INFO);
message.SetParameter(LogParameter.DETAILS, string.Format("Machine Name: {0}", Environment.MachineName));
this.Log(message);
}
///
/// A kiszolgáló leállt.
///
public void ServerStopped()
{
LogMessage message = CreateLogMessage(Events.FRAMEWORK_SERVERSTOP, LogLevel.INFO);
System.Diagnostics.StackTrace stacktrace = new System.Diagnostics.StackTrace(); // XXX
message.SetParameter(LogParameter.STACKTRACE, stacktrace.ToString()); // XXX
this.Log(message);
}
///
/// A kiszolgáló külső leállítási kérelmet kapott.
///
public void ServerStopping()
{
LogMessage message = CreateLogMessage(Events.FRAMEWORK_SERVER_STOPPING, LogLevel.INFO);
message.SetParameter(LogParameter.DETAILS, "Külső leállítási kérelem folyamatban.");
this.Log(message);
}
#endregion
#region Munkamenet kezelés eseményei
///
/// Az összes munkamenet meg lett szüntetve.
///
/// Sikeres volt-e
public void SessionCleanup(bool successful)
{
LogMessage message = CreateLogMessage(Events.FRAMEWORK_SESSIONCLEANUP, LogLevel.INFO);
message.SetParameter(LogParameter.SUCCESSFUL, successful.ToString());
this.Log(message);
}
public void LoginSuccess(LoginInfo info)
{
LogMessage message = CreateLogMessage(Events.FRAMEWORK_USER_LOGIN, LogLevel.INFO);
message.SessionId = info.SessionID;
message.SetParameter(LogParameter.USERID, info.FelhasznaloId);
message.SetParameter(LogParameter.USERNAME, info.BelepesiNev);
message.SetParameter(LogParameter.CLIENTIP, info.ClientIP);
message.SetParameter(LogParameter.INTEZMENYID, info.IntezmenyId);
message.SetParameter(LogParameter.TANEVID, info.AktivTanevId);
this.Log(message);
}
///
/// A munkamenet meg lett szűntetve.
///
/// A munkamenet azonosítója
public void SessionDeleted(string sessionId)
{
LogMessage message = CreateLogMessage(Events.FRAMEWORK_SESSIONDELETED, LogLevel.INFO);
message.SessionId = sessionId;
this.Log(message);
}
///
/// A munkamenet lejárt és meg lett szűntetve.
///
/// A munkamenet azonosítója
public void SessionExpired(string sessionId)
{
LogMessage message = CreateLogMessage(Events.FRAMEWORK_SESSIONEXPIRED, LogLevel.INFO);
message.SessionId = sessionId;
this.Log(message);
}
#endregion
#region Kivételkezelés eseményei
#region Kliens
///
/// Kliensen történt kivétel
///
/// A kivétel leírása és körülményei
public void ClientExceptionThrown(string _details)
{
LogMessage message = CreateLogMessage(Events.CLIENT_GENERAL, LogLevel.ERROR);
message.SetParameter(LogParameter.DETAILS, _details);
if (UserContext.Instance != null)
{
message.SetParameter(LogParameter.CONTEXT_INFO, UserContext.Instance.ToString());
}
this.Log(message);
}
#endregion
///
/// Kivétel történt.
///
/// A naplózandó kivétel
public Guid? ExceptionThrown(FrameworkException exception)
{
if (exception == null || exception.IsLogged)
{
return null;
}
LogMessage message = CreateLogMessage((Events)exception.ClientErrorCode, exception.LogLevel, exception.Id);
message.SetParameter(LogParameter.DETAILS, ExceptionUtil.ExceptionToString(exception));
if (UserContext.Instance != null)
{
message.SetParameter(LogParameter.CONTEXT_INFO, UserContext.Instance.ToString());
}
else
{
if (exception.Data.Contains(LogParameter.SESSIONID))
{
object obj = exception.Data[LogParameter.SESSIONID];
if (obj.GetType() == typeof(string))
{
message.SessionId = (string)obj;
}
}
}
var logId = this.Log(message);
exception.SetLogged();
return logId;
}
///
/// Kivétel történt.
///
/// A naplózandó kivétel
public Guid? ExceptionThrown(Exception exception)
{
return ExceptionThrown(exception, null);
}
///
/// Kivétel történt.
///
/// A naplózandó kivétel
/// Az ügyfél IP-címe
public Guid? ExceptionThrown(Exception exception, string clientIP)
{
FrameworkException frameworkexception = exception as FrameworkException;
if (frameworkexception != null)
{
return ExceptionThrown(frameworkexception);
}
if (exception != null && !object.Equals(exception.Data["$IsLogged"], true))
{
LogMessage message = CreateLogMessage(Events.SYSTEM_EXCEPTION, LogLevel.ERROR);
message.SetParameter(LogParameter.DETAILS, ExceptionUtil.ExceptionToString(exception));
if (clientIP != null)
{
message.SetParameter(LogParameter.CLIENTIP, clientIP);
}
if (UserContext.Instance != null)
{
message.SetParameter(LogParameter.CONTEXT_INFO, UserContext.Instance.ToString());
}
var logId = this.Log(message);
exception.Data["$IsLogged"] = true;
return logId;
}
return null;
}
#endregion
#region Akciók eseményei
///
/// Akció meghívása történt.
///
/// Az akció neve
public void ActionExecuted(string actionName)
{
LogMessage message = CreateLogMessage(Events.ACTION_EXECUTE, LogLevel.DEBUG);
message.SetParameter(LogParameter.OPERATIONNAME, actionName);
this.Log(message);
}
#endregion
#region Entitások eseményei
///
/// Nem sikerült naplóznunk egy entitás történelmét.
///
/// Az entitás azonosítója
/// Az entitás neve
public void SaveEntityHistoryFailed(int entityId, string entityName)
{
LogMessage message = CreateLogMessage(Events.FRAMEWORK_ENTITYHISTORYFAILED, LogLevel.ERROR);
message.SetParameter(LogParameter.ENTITYID, entityId);
message.SetParameter(LogParameter.ENTITYNAME, entityName);
this.Log(message);
}
#endregion
#region Adatbáziskezelés eseményei
///
/// Ügylet kezdete.
///
public void BeginTransaction()
{
LogMessage message = CreateLogMessage(Events.FRAMEWORK_BEGINTRANSACTION, LogLevel.INFO);
this.Log(message);
}
///
/// Ügylet vége jóváhagyással.
///
public void CommitTransaction()
{
LogMessage message = CreateLogMessage(Events.FRAMEWORK_COMMITTRANSACTION, LogLevel.INFO);
this.Log(message);
}
///
/// Ügylet vége visszagörgetéssel.
///
public void RollbackTransaction()
{
LogMessage message = CreateLogMessage(Events.FRAMEWORK_ROLLBACKTRANSACTION, LogLevel.INFO);
this.Log(message);
}
///
/// SQL utasítás lett végrehajtva.
///
/// Végrehajtandó SQL utasítás
/// Sorszurt SQL utasításra célszeru használni.
public void SQLExecuted(string sqlText)
{
LogMessage message = CreateLogMessage(Events.SQL_EXECUTED, LogLevel.DEBUG);
message.SetParameter(LogParameter.SQLTEXT, sqlText);
this.Log(message);
}
#endregion
}
}