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 } }