C#Web App:用于外部日志记录的自定义记录器

时间:2017-04-05 08:49:30

标签: c# logging web-applications aws-lambda

你好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;
            }
        } 

0 个答案:

没有答案