Serilog初識 二 結構化資料

2021-09-26 02:00:17 字數 4598 閱讀 4478

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...