你好c#专家,
我在c#中编写一个AWS lambda函数,需要外部日志记录(我必须将所有日志写入外部端点)。我一直在阅读很多关于最佳实践的文章。我还对c#库进行了一些研究,如NLog,Log4Net等(有些库与.Net Core不兼容)。
我的主要要求是我不想在代码中的任何地方传递 Logger 对象。相反,我应该能够更像静态方法调用编写外部日志(例如: Logger.sendLog(“日志消息”); )。
考虑到上述要求和线程问题,我决定将我的Logger实现为单例,目前工作正常。但是,我很想知道这个设计是否有任何特殊问题。如果有更好的方法来实现写入外部日志的自定义Logger类,请告诉我。
谢谢。
interface ILogger
{
void init();
void setUserInfo(UserInfo userInfo);
void sendLog(Dictionary<LogKey, object> payload);
}
public sealed class Logger : ILogger
{
private static readonly Logger instance = new Logger();
private static LogObject logObject;
public static Logger Instance
{
get
{
return instance;
}
}
public void init()
{
logObject = new LogObject();
logObject.appId = AppConfig.appId;
logObject.application = AppConfig.appName;
logObject.version = AppConfig.appVersion;
logObject.environment = EnvConfig.Instance.clientConfig.environment;
logObject.clientName = EnvConfig.Instance.clientConfig.clientName;
}
public void setUserInfo(UserInfo userInfo)
{
logObject.userId = userInfo.userId;
logObject.userName = userInfo.userName;
}
public void sendLog(Dictionary<LogKey, object> payload)
{
setTimeStamp();
logObject.log_level = LogLevel.INFO.ToString();
logObject.payload = payload;
deliverLog(JsonConvert.SerializeObject(logObject));
resetLogObj();
}
private void deliverLog(string logStr)
{
// External API call here
}
private void setTimeStamp()
{
logObject.timestamp = DateTime.UtcNow;
}
private void resetLogObj()
{
logObject.payload = null;
}
}