초기커밋
This commit is contained in:
243
ServerBase/BusinessLog/Log/ILog.cs
Normal file
243
ServerBase/BusinessLog/Log/ILog.cs
Normal file
@@ -0,0 +1,243 @@
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
|
||||
|
||||
using Amazon.OpenSearchService.Model.Internal.MarshallTransformations;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Serialization;
|
||||
|
||||
|
||||
using ServerCore; using ServerBase;
|
||||
|
||||
|
||||
using LOG_ACTION_TYPE = System.String;
|
||||
using LOG_DOMAIN_TYPE = System.String;
|
||||
|
||||
|
||||
namespace ServerBase;
|
||||
|
||||
public enum LogTransToOutputType
|
||||
{
|
||||
TransToMultyLine = 0, // Body 갯수대로 로그 출력
|
||||
TransToSingleLine = 1, // 한개의 Body로 로그 출력
|
||||
}
|
||||
|
||||
//===================================================================================
|
||||
// 로그 액션
|
||||
//===================================================================================
|
||||
|
||||
public partial class LogAction
|
||||
{
|
||||
private readonly LOG_ACTION_TYPE m_log_action_type = string.Empty;
|
||||
private Guid m_tran_id = Guid.Empty;
|
||||
|
||||
public LogAction(LOG_ACTION_TYPE logActionType)
|
||||
{
|
||||
m_log_action_type = logActionType;
|
||||
m_tran_id = Guid.NewGuid();
|
||||
}
|
||||
|
||||
public LogAction(LOG_ACTION_TYPE logActionType, Guid tranId)
|
||||
{
|
||||
m_log_action_type = logActionType;
|
||||
m_tran_id = tranId;
|
||||
}
|
||||
|
||||
}//LogAction
|
||||
|
||||
|
||||
//===================================================================================
|
||||
// 로그를 발생 시킨다
|
||||
//===================================================================================
|
||||
|
||||
public abstract partial class ILogInvoker
|
||||
{
|
||||
private LogAction? m_log_action_nullable;
|
||||
private readonly LOG_DOMAIN_TYPE m_log_domain_type = string.Empty;
|
||||
|
||||
public ILogInvoker()
|
||||
{
|
||||
}
|
||||
|
||||
public ILogInvoker(LOG_DOMAIN_TYPE logDomainType)
|
||||
{
|
||||
m_log_domain_type = logDomainType;
|
||||
}
|
||||
|
||||
public ILogInvoker(LOG_DOMAIN_TYPE logDomainType, LogAction logAction)
|
||||
{
|
||||
m_log_action_nullable = logAction;
|
||||
m_log_domain_type = logDomainType;
|
||||
}
|
||||
|
||||
public ServerErrorCode alloc(ILogActor logActor, out BusinessLog? businessLog)
|
||||
{
|
||||
ArgumentNullReferenceCheckHelper.throwIfNull(logActor, () => $"logActor is null !!!");
|
||||
|
||||
businessLog = null;
|
||||
|
||||
if (null == m_log_action_nullable)
|
||||
{
|
||||
return ServerErrorCode.LogActionIsNull;
|
||||
}
|
||||
|
||||
var header = new BusinessLog.LogHeader(m_log_action_nullable.getTranId().ToString(), logActor);
|
||||
var body = new BusinessLog.LogBody(m_log_action_nullable.getLogActionType());
|
||||
{
|
||||
fillup(ref body);
|
||||
}
|
||||
|
||||
businessLog = new BusinessLog(header, body);
|
||||
|
||||
return ServerErrorCode.Success;
|
||||
}
|
||||
|
||||
public static ServerErrorCode alloc( LOG_ACTION_TYPE logActionType, Guid tran
|
||||
, ILogActor actorLog, List<ILogInvoker> invokers
|
||||
, LogTransToOutputType outputType, ref List<BusinessLog> outLogs )
|
||||
{
|
||||
if (logActionType.isNullOrWhiteSpace())
|
||||
{
|
||||
return ServerErrorCode.LogActionTypeInvalid;
|
||||
}
|
||||
|
||||
var header = new BusinessLog.LogHeader(tran.ToString(), actorLog);
|
||||
switch (outputType)
|
||||
{
|
||||
case LogTransToOutputType.TransToMultyLine:
|
||||
{
|
||||
foreach (var each in invokers)
|
||||
{
|
||||
var body = new BusinessLog.LogBody(logActionType);
|
||||
{
|
||||
if (false == each.hasLog())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
each.fillup(ref body);
|
||||
|
||||
outLogs.Add(new BusinessLog(header, body));
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case LogTransToOutputType.TransToSingleLine:
|
||||
{
|
||||
var body = new BusinessLog.LogBody(logActionType);
|
||||
{
|
||||
foreach (var each in invokers)
|
||||
{
|
||||
if (false == each.hasLog())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
each.fillup(ref body);
|
||||
}
|
||||
outLogs.Add(new BusinessLog(header, body));
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return ServerErrorCode.Success;
|
||||
}
|
||||
|
||||
protected abstract void fillup(ref BusinessLog.LogBody body);
|
||||
|
||||
// 로그가 들어 있는지 검사한다.
|
||||
public abstract bool hasLog();
|
||||
|
||||
public virtual string toBasicString()
|
||||
{
|
||||
return $"LogInvoker:{this.getTypeName()}";
|
||||
}
|
||||
|
||||
//===================================================================================
|
||||
// 사용자 정의 로그 정보 추상 클래스 이다.
|
||||
//===================================================================================
|
||||
public abstract class IInfo
|
||||
{
|
||||
[JsonProperty(Order = -2)]
|
||||
private readonly LOG_DOMAIN_TYPE Domain = string.Empty;
|
||||
|
||||
// ILogInvoker 에 의해 생성될 경우 로그 정보 컨테이너에 적재되고
|
||||
// 로그 정보를 Json 기반으로 직렬화 한다.
|
||||
public IInfo(ILogInvoker parent)
|
||||
{
|
||||
Domain = parent.m_log_domain_type;
|
||||
}
|
||||
|
||||
// 로그 정보 전달 객체로 활용 된다 !!!
|
||||
public IInfo()
|
||||
{
|
||||
}
|
||||
}//IInfo
|
||||
}//ILogInvoker
|
||||
|
||||
|
||||
public class BusinessLog
|
||||
{
|
||||
[JsonProperty]
|
||||
private readonly LogHeader Header;
|
||||
[JsonProperty]
|
||||
private readonly LogBody Body;
|
||||
|
||||
public BusinessLog(LogHeader header, LogBody body)
|
||||
{
|
||||
Header = header;
|
||||
Body = body;
|
||||
}
|
||||
|
||||
public bool hasLog()
|
||||
{
|
||||
return Header != null && Body != null && Header.hasLog() && Body.hasLog();
|
||||
}
|
||||
|
||||
public class LogHeader
|
||||
{
|
||||
[JsonProperty]
|
||||
private readonly string TranId = string.Empty;
|
||||
[JsonProperty]
|
||||
private readonly ILogActor Actor;
|
||||
|
||||
public LogHeader(string tran_id, ILogActor actor_log)
|
||||
{
|
||||
TranId = tran_id;
|
||||
Actor = actor_log;
|
||||
}
|
||||
|
||||
public bool hasLog()
|
||||
{
|
||||
return Actor != null;
|
||||
}
|
||||
}
|
||||
|
||||
public class LogBody
|
||||
{
|
||||
[JsonProperty]
|
||||
private readonly LOG_ACTION_TYPE Action = string.Empty;
|
||||
[JsonProperty]
|
||||
private readonly List<ILogInvoker.IInfo> Infos = new List<ILogInvoker.IInfo>();
|
||||
|
||||
public LogBody(LOG_ACTION_TYPE action)
|
||||
{
|
||||
Action = action;
|
||||
}
|
||||
|
||||
public bool hasLog(bool allow_empty = false)
|
||||
{
|
||||
if (Action.isNullOrWhiteSpace())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return allow_empty ? true : Infos.Count != 0;
|
||||
}
|
||||
|
||||
public void append(ILogInvoker.IInfo info)
|
||||
{
|
||||
Infos.Add(info);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user