serilog是乙個序列化器,如果我們不主動告訴serilog資料該如何序列化的時候,serilog對資料也有預設的序列方式。
基本標量型別的屬性
如果我們要序列化的屬性是簡單標量型別的話,serilog很容易識別是什麼,並進行序列化,例如標量型別是int型別。
int sum = 100;
log.information("序列化int型別:", sum);
seilog遇到下列的幾種型別,都會識別為基本標量。
布林型別 bool
numerics(數值型別)
byte
ushort
intuint
long
ulong
float
double
decimal
strings (字串型別)
string
byte
temporals (與時間相關)
datetime
datetimeoffset
timespan
other(其它)
guid
uri
nullables——以上所有型別的可空版本
集合serilog如果發現屬性實現了ienumerable介面,那麼serilog會識別為集合
listlist = new list() ;
string strs = new string ;
log.information("實現了ienumerable介面的集合:", list,strs);
同時,serilog也認識dictionary這個型別,不過前提是dictionary中的key型別是基本標量
dictionarydic = new dictionary();
dic.add("li", 23);
dic.add("yang", 19);
log.information("dictionary型別:",dic);
ps:如果有實現了idictionary介面的字典物件但沒有被序列化成字典的話,官方給出了兩點解釋:
1.在.net中檢查通用介面相容性的效率較低
2.因為單個物件可能實現多個通用字典介面,從而產生歧義。
例如,我們序列化sorteddictionary這個類的物件
sorteddictionarysdic = new sorteddictionary();
sdic.add(「li」, 123);
sdic.add(「yang」, 456);
sdic.add(「hong」, 12);`
log.information(「dictionary型別:」,sdic);
被serilog認為是集合(因為實現了ienumberable介面),序列化成集合。
物件(object)
serilog如果要序列化除上面描述的物件以外的物件,往往就很難做出明確的選擇
定義student類和teacher類
abstract class person
public int age
}class teacher :person
public teacher(guid id, string name,int age)
}class student:person
private guid guidid
public teacher teacher
}
//自定義類的物件
teacher teacher = new teacher("wen",45);
student student = new student("lic",12);
student.teacher = teacher;
//httpclient物件
log.information("自定義物件:", teacher);
log.information("student物件:", student);
log.information("httpclient物件:", hc);
serilog判斷不出物件是什麼型別,所以呼叫了物件的tostring
方法,並對結果進行序列化
serilog提供了@
解構運算子。
log.information("自定義物件:", teacher);
log.information("student物件:", student);
log.information("httpclient物件:", hc);
我們如果只是單單新增@
來進行序列化,serilog會將物件中的所有public屬性給序列化。
如果我們不想序列化物件的全部public屬性怎麼辦呢?也就是想要自定義物件結構
我們可以使用destructure
來配置logconfiguration
log.logger = new loggerconfiguration()
//設定最低等級
.minimumlevel.debug()
//對自定義物件進行篩選
.destructure.bytransforming(t=>new )
.destructure.bytransforming(s=>new )
//將事件傳送到控制台並展示
.writeto.console(outputtemplate:logformat)
.createlogger();
我們再次執行程式的時候。
當然 除了這種方法還有其它做法可以實現效果,serilog.extras.attributed
程式包,這個只需要在類中屬性新增乙個特性,就可以告訴serilog是否忽略,下面我們來演示一下.
abstract class person
[notlogged]
public int age
}
log.logger = new loggerconfiguration()
//設定最低等級
.minimumlevel.debug()
//使用serilog.extras.attributed中的擴充套件方法
.destructure.usingattributes()
//將事件傳送到控制台並展示
我們可以看到圖中age屬性被serilog忽略了
除此之外serilog.extras.attributed
程式包還有乙個特性,[logasscalar]
特性,這個特性會在序列化的時候呼叫tostring
方法(沒加@
時serilog物件序列化的方式)
如果沒有了[logasscalar]
teacher對應的值是以json形式的資料,但這種形式在日誌是沒有多大作用的,所以我們可以用tostring的方式來表示
參考文章
官方文件:
部落格:
結構化資料 半結構化資料 非結構化資料
結構化資料 即行資料,儲存在資料庫裡,可以用二維表結構來邏輯表達實現的資料 所謂半結構化資料,就是介於完全結構化資料 如關係型資料庫 物件導向資料庫中的資料 和完全無結構的資料 如聲音 影象檔案等 之間的資料,html文件就屬於半結構化資料。它一般是自描述的,資料的結構和內容混在一起,沒有明顯的區分...
結構化資料 半結構化資料和非結構化資料
本文 在實際應用中,我們會遇到各式各樣的資料庫如nosql非關聯式資料庫 memcached,redis,mangodb rdbms關聯式資料庫 oracle,mysql等 還有一些其它的資料庫如hbase,在這些資料庫中,又會出現結構化資料,非結構化資料,半結構化資料,下面列出各種資料型別 結構化...
結構化資料 半結構化資料和非結構化資料
結構化資料 半結構化資料和非結構化資料 結構化的資料是指可以使用關係型資料庫表示和儲存,表現為二維形式的資料。一般特點是 資料以行為單位,一行資料表示乙個實體的資訊,每一行資料的屬性是相同的。舉乙個例子 id name age gender 1 lyh 12 male 2 liangyh 13 fe...