最近使用Abp開發了一個項目,對abp有一個大概的了解,第一個小項目接近尾聲,新的項目馬上開始,針對開發第一個項目中發現的問題及不方便的地方,本人做一些修改,特此記錄,請大家多多指正!
本人的開發環境vs2017 ,vs code,使用abp版本為abp3.5 + angular開發,安裝過程就免了,另外本人使用的aspnetzero。請大家自覺支持正版,技術支持很給力。
首先,完善下Abp的日志,apb 的日志系統使用Castle Windsor的日志記錄工具,它可以和不同的logginh(日志)類庫協作:Log4Net、NLog、Serilog等。Castle為所有Logger庫提供一個公共接口,所以它獨立於logging庫,也可以在有需要的時候很容易地替換logging。
ABP模板 默認采用采用Log4Net,進行了簡單的配置,主要是文件日志,查看下log4net的配置方法,嘗試了其他的配置,例如數據庫等,有些可以成功,有些不行:
1 <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender" > 2 <file type="log4net.Util.PatternString" value="App_Data/Logs/Log.txt"/> 3 <appendToFile value="true" /> 4 <rollingStyle value="Size" /> 5 <maxSizeRollBackups value="10" /> 6 <maximumFileSize value="10000KB" /> 7 <staticLogFileName value="true" /> 8 <layout type="log4net.Layout.PatternLayout"> 9 <conversionPattern value="%-5level %date [%-5.5thread] %-40.40logger - %message%newline" /> 10 </layout> 11 </appender>
abp默認不在控制台輸出日志內容,因此有時候錯誤沒辦法找,必須打開日志文件(App_Data/Logs/Log.txt)查找最新的錯誤,這個有點低端,每次打開文本效率有點低,不符合我一貫能裝的性格,有沒有其他查看日志的方法:web signalr方式,我能想到的大神們估計都想到了,我這里配置了兩個能裝逼的:log2console和exceptionless;完成這個瞬間牛逼了許多。
先說第一個問題,abp日志配置有個問題就是有的配置節點中的layout type不能采用其他格式,主要是xml格式的貌似不支持;
xml配置方式是log2console的默認配置方式
1 <appender name="FileAppender" type="log4net.Appender.FileAppender"> 2 <file value="log-file.txt" /> 3 <appendToFile value="true" /> 4 <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 5 <layout type="log4net.Layout.XmlLayoutSchemaLog4j" /> 6 </appender>
這個配置在abp中是沒效果的,是不是我漏掉什么了,大神們給個提示,非常感謝!
exceptionless也是這樣,無敵了,叔可忍嬸不可忍!
1、log2console
修改log2console源碼,添加一個receiver,要做的很簡單,復制原來的udp receiver,修改解析方法,首先做一個PatternLayout:
1 <layout type="log4net.Layout.PatternLayout"> 2 <conversionPattern value='{"date":"%date","thread":"%-5.5thread","level":"%-5level","logger":"%-40.40logger"} %message' /> 3 </layout>
這個很簡單,就是把消息包裝成json字符串加上message。
在log2console,Log2Console.Receiver.ReceiverUtils類中添加解析函數:
1 public static LogMessage ParsePatternLayoutLogEvent(string logEvent, string defaultLogger) 2 { 3 var logMsg = new LogMessage(); 4 var sl = logEvent.Split('}'); 5 if (sl.Length < 2) 6 logMsg.Message = logEvent; 7 else 8 { 9 var jo = Newtonsoft.Json.JsonConvert.DeserializeObject<msgObj>(sl[0] + "}"); 10 logMsg.TimeStamp = DateTime.Parse(jo.date.Trim().Replace(',','.')); 11 logMsg.Level = LogLevels.Instance[jo.level.Trim()]; 12 logMsg.LoggerName = jo.logger.Trim(); 13 logMsg.ThreadName = jo.thread.Trim(); 14 logMsg.Message = sl[1]; 15 } 16 return logMsg; 17 18 }
在receiver中添加新的解析類UdpPatternLayoutReceiver,簡單復制udpReceiver,修改幾行代碼即可,start函數中,修改解析方法:
LogMessage logMsg = ReceiverUtils.ParsePatternLayoutLogEvent(loggingEvent, "UdpLogger");
另外修改SampleClientConfig,可以給用戶提供個配置提示。
編譯生成log2console。
最終生成的log2console界面。
最后一步,在abp項目中添加udp配置:
1 <appender name="UdpAppender" type="log4net.Appender.UdpAppender"> 2 <param name="Encoding" value="utf-8" /> 3 <remoteAddress value="10.1.12.188" /> 4 <remotePort value="7071" /> 5 <layout type="log4net.Layout.PatternLayout"> 6 <conversionPattern value='{"date":"%date","thread":"%-5.5thread","level":"%-5level","logger":"%-40.40logger"} %message' /> 7 </layout> 8 </appender> 9 10 11 12 <root> 13 14 ........ 15 <appender-ref ref="UdpAppender" /> 16 <level value="ALL" /> 17 </root>
現在,解決了看日志的問題了。
2、exceptionless配置
解決了看日志的問題保存日志的問題還是保存在文件里,查看歷史不方便,exceptionless很好。
exceptionless的安裝按照官方說明安裝即可,我是在iis上安裝的,安裝過程中要注意兩點,一是版本es版本要按照說明的版本安裝,最新版本不支持。二是,es安裝完成后,折騰了好長時間,我安裝了head這個插件,進行配置沒問題了,覺得安裝過程中主要是配置了這個參數:
action.auto_creat_index:true 但沒有測試不安裝head插件僅配置這個參數是否可用。
es的head插件安裝成功界面。
安裝完成打開exceptionless,注冊一個賬號后,配置exceptionless,不允許新用戶注冊即可:
webconfig中添加或修改:<add key="EnableAccountCreation" value="true" />
exceptionless 安裝成功。
配置abp中log 的exceptionless:
<appender name="exceptionless" type="Exceptionless.Log4net.ExceptionlessAppender,Exceptionless.Log4net"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%-4timestamp [%thread] %-5level %logger %ndc - %message%newline"/> </layout> </appender> <root> //其他配置 <appender-ref ref="exceptionless" /> <level value="ALL" /> </root>
安裝nuget exceptionless的包:exceptionless.aspnetcore
在app.config中配置:
"Exceptionless": {
"ApiKey": "你的apkkey",
"ServerUrl": "http://你的地址",
"DefaultData": {
"JSON_OBJECT": "{ \"Name\": \"Blake\" }",
"Boolean": true,
"Number": 1,
"Array": "1,2,3"
},
"DefaultTags": [ "xplat" ],
"Settings": {
"FeatureXYZEnabled": false
}
},
最后在host項目的startup的Configure函數中添加:app.UseExceptionless(_appConfiguration);
后續主要有這些方面的完善,敬請期待:
大功告成,謝謝你的打賞!