.HTML的骨架
在編寫html時我們們首先要寫出以下代碼。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
</html>
不要被這一大長串嚇到,在VSCode編譯器中html文件第一行打出“!”便會自動得到這些代碼。我們來認識一下這些標簽都是什么。
<!DOCTYPE html>
html文件第一行必須是DTD(Document Type Definition,文檔類型聲明),不寫DTD會引發瀏覽器的一些兼容問題。
<html lang="en">
.
.
.
</html>
<html></html>標簽對,將<head></head>標簽對和<body></body>標簽對放入其中,lang屬性為網頁語言,英語為en,中文為zh。
注意:head標簽對和body標簽對需要在html標簽對中縮進
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
</html>
<head></head>標簽對中是網頁的配置,而并非網頁頭部
head標簽對中<meta charset="UTF-8">為設置字符集,<meta>標簽為元標簽,表示網頁的基礎配置;
UTF-8為制作網頁所使用的字符集,與gb2312的區別可參考下圖。
在<head></head>中的<title></title>中書寫網頁的標題,文字會顯示在瀏覽器的標簽欄上。title也是搜索引擎收錄網站時顯示的標題,所以我們需要合理的設置title以吸引用戶的點擊。
使用meta標簽設置網頁關鍵詞和描述,name屬性非常關鍵,用來設置meta的具體功能。
<meta name="Keywords" content="關鍵詞1,關鍵詞2,關鍵詞3">
<meta name="Description" content="頁面描述是搜索引擎顯示的簡介詞語">
<body></body>標簽對中用來寫網頁的主要內容,包括網頁頭部,內容,頁腳等等。
2、標簽
html叫做“超文本標記語言”,超文本標記就是標簽,這些標簽擁有不同的功能。
標簽通常成對兒出現;但meta標簽為單標簽,只有起始標簽。
標簽可以給文字設置不同的“語義”。
1.標題標簽
<h1>一級標題</h1><h2>二級標題</h2><h3>三級標題</h3><h4>四級標題</h4><h5>五級標題</h5> <h6>六級標題</h6>
實際顯示效果如圖。
搜索引擎非常看重<h1></h1>標簽的內容,應該將重點內容比如網頁的logo等放到<h1></h1>中以加大其權重。<h1></h1>標簽一般只能放置一個,否則會被搜索引擎視為作弊。
六級標題雖然很像普通文本進行了加粗,但不應該僅僅為了加粗而使用<h6></h6>標簽對。
2.段落標簽——p標簽對
<p>段落標簽,p是英語paragraph的意思</p><p>在HTML文件中即使代碼換行了,頁面顯示效果也不會換行</p><p>所以必須要把任何段落都放入段落標簽中</p> <p>段落標簽中不能嵌套標題標簽和其他段落標簽</p>
在網頁中顯示的效果如圖。
3.div標簽
div是英語division“分割”的縮寫,<div></div>標簽對用來將相關的內容組合到一起,以和其
他內容分割,使文檔結構更清晰。最重要的一點是,它可以結合CSS使用,實現網頁的布局,這種布局形式叫做“DIV+CSS”。
div標簽對的應用是html中非常重要的知識點。
<div>
<h3>標題三</h3>
<p>段落1</p>
<p>段落2</p>
<p>段落3</p>
</div>
4.注釋與轉義字符
書寫代碼時,我們需要寫好注釋使日后再閱讀代碼或者他人閱讀代碼提供提示。
為了在書寫“<”“>”等符號時不被當作標簽,我們需要使用轉義字符來表示它們。
<!-- 注釋內容 -->
<p><為小于號</p>
<p>>為大于號</p>
<p> 為不會被折疊的空格</p>
<p>?為版權符號</p>
在網頁中顯示的效果如圖。
總結
通過此次的學習,我們認識了html骨架,標題標簽,段落標簽,div標簽,注釋寫法與部分轉義字符寫法。下次的學習內容將會是列表標簽和多媒體語義化標簽。
統內核和許多程序會產生各種錯誤信息、警告信息和其他的提示信息,這些信息對用戶了解系統的運行狀態是非常有用的,所以需要把它們保存到對應的日志文件中,以便后續進行分析和監控系統或軟件的狀態。 Linux 系統擁有非常靈活和強大的日志功能,幾乎可以保存所有的操作記錄,并可以從中檢索出我們需要的信息。完成這個工作的守護進程就是 rsyslog。
談及 rsyslog[1],就不可避免的涉及另外兩個軟件 syslog[2] 和 syslog-ng[3]。這三款軟件設計的目標是一樣的,就是解決系統和程序的日志收集問題。每一個項目都在試圖提高前者的穩定性和功能性。
syslog 由 Eric Allman 在 1980 年代開發,是 Sendmail 項目的一部分。因為它的易用性被很多類 Unix 系統使用,成為其標準的日志記錄解決方案。在這個過程中,它演變成一種協議,成為在互聯網協議(TCP/IP)的網絡中傳遞記錄檔消息的標準。
syslog 協議屬于一種主從式協議:syslog 發送端會發送出一個小的文字消息(小于 1024 位組)到 syslog 接收端。接收端通常名為 syslogd、syslog daemon 或 syslog 服務器。系統日志消息可以被以 UDP 協議或 TCP 協議來發送。這些資料是以明碼類型被發送。不過由于 SSL 加密外套(例如 Stunnel、sslio 或 sslwrap 等)并非 syslog 協議本身的一部分,因此可以被用來透過SSL/TLS 方式提供一層加密。
syslog-ng 是 syslog NextGeneration 的簡寫。該項目發起于 1998 年并基于 syslog 協議開發。作為 syslog 的下一代產品,功能肯定比 syslog 強大的多,如高性能,可靠的傳輸,支持多平臺,高可靠性,眾多的用戶群體,強大的日志過濾及排序,事件標簽和關聯性,支持最新的IETF標準等。
rsyslog 是 the rocket-fast system for log processing 的簡寫。該項目始于 2004 年,當時 rsyslog 的主要作者 Rainer Gerhards 決定編寫一個新的強大 syslog 守護程序來與 syslog-ng 競爭。它實現了基本的 syslog 協議,并擴展了基于內容的過濾功能,豐富了過濾能力,處理脫機輸出的隊列操作,支持不同模塊的輸出,配置選項更加靈活,并添加了使用 TCP 進行傳輸的功能。
由于 rsyslog 的高性能,出色的安全性和模塊化設計,它不僅作為常規的系統日志收集工具,還能夠接受各種來源的輸入,將其轉換,然后將結果輸出到不同的目的地。
它的優勢有如下:
? 高性能(使用 C 編寫,運用多線程)
? 支持 TCP, SSL, TLS, RELP
? 支持多種輸出(MySQL, PostgreSQL等)
? 支持對系統日志的過濾
? 靈活配置多種輸出
正因為如此,它是眾多類 Unix 系統和 GNU/Linux 發行版系統日志采集的首選。
既然三款軟件都基于 syslog 協議,那就先來介紹一下 syslog 協議。相關 RFC 文件有 2001 年發行的RFC 3164[4](The BSD syslog Protocol), 2009 年發行的 RFC 5424[5](The Syslog Protocol), RFC 5425[6](Transport Layer Security Mapping for Syslog),RFC 5426[7](Transmission of Syslog Messages over UDP)。其中RFC 3164 已經被 RFC 5424 廢除,所以下面介紹的以 RFC 5424 為準。
Syslog 協議使用三層結構,第一層是消息層,指要傳輸的信息;第二層是應用層,主要用于消息的生成,解析,路由和存儲,代表有發送者,中繼器和接受者。第三層是傳輸層,主要用于發送和接收網絡上的信息,代表有發送設備和接收設備。 具體的層次結構見下圖(這塊的理解可以參考 OSI 7層模型或 TCP/IP 4層模型):
syslog 協議遵循以下的原則:
? 協議沒有信息確認機制 消息從發送者發送到接受者的 UDP 514 端口,不需要接收方應答。
? 發送者和中繼器可以將相同的消息發送給多個接收者和中繼器
? 發送者,中繼器和接收者可以部署在同一個系統上。
按照上述原則,有如下圖的部署場景。
syslog 協議定義了消息格式,由三部分組成:消息頭 HEADER ,結構化數據 STRUCTURED-DATA 和消息 MSG(可選)。其中消息頭又包含優先級(PRIority),版本號(VERSION),時間戳(TIMESTAMP),主機名(HOSTNAME), 應用名(APP-NAME),進程標識(PROCID)和消息標識(MSGID)。
其中優先級由設備(Facility)和嚴重性(Severity)共同決定。PRI=Facility * 8 + Severity。 設備的可選值有以下24個:
代號 | 設備(Facility) | 注釋 |
0 | kernel messages | 內核相關 |
1 | user-level messages | 用戶相關(默認) |
2 | mail system | 郵件相關 |
3 | system daemons | 系統守護進程相關 |
4 | security/authorization messages (note 1) | 登陸授權相關 |
5 | messages generated internally by syslogd | syslogd相關 |
6 | line printer subsystem | 打印相關 |
7 | network news subsystem | 新聞相關 |
8 | UUCP subsystem | unix到unix的cp相關 |
9 | clock daemon (note 2) | 任務計劃相關 |
10 | security/authorization messages (note 1) | 登陸授權相關 |
11 | FTP daemon | FTP相關 |
12 | NTP subsystem | |
13 | log audit (note 1) | 登陸授權相關 |
14 | log alert (note 1) | 登陸授權相關 |
15 | clock daemon (note 2) | 任務計劃相關 |
16 | local use 0 (local0) | 用戶自定義0 |
17 | local use 1 (local1) | 用戶自定義1 |
18 | local use 2 (local2) | 用戶自定義2 |
19 | local use 3 (local3) | 用戶自定義3 |
20 | local use 4 (local4) | 用戶自定義4 |
21 | local use 5 (local5) | 用戶自定義5 |
22 | local use 6 (local6) | 用戶自定義6 |
23 | local use 7 (local7) | 用戶自定義7 |
嚴重性的可選值有以下8個,這也是Facility * 8的原因:
代號 | 嚴重性(Severity) | 注釋 |
0 | Emergency: system is unusable | 崩潰級別 |
1 | Alert: action must be taken immediately | 報警級別 |
2 | Critical: critical conditions | 危急級別 |
3 | Error: error conditions | 錯誤級別 |
4 | Warning: warning conditions | 警告級別 |
5 | Notice: normal but significant condition | 提示級別 |
6 | Informational: informational messages | 消息級別 |
7 | Debug: debug-level messages | 調試級別 |
? 協議的實現必須支持基于 TLS 的傳輸,應該支持基于 UDP 的傳輸
? 所有接收設備必須能夠結構長度不超過480個八位字節的消息,應該接收長度最大為2048個八位字節的消息,可以接收超過2048個八位字節的消息(可以截斷或丟棄)。
鑒于 rsyslog 已經是眾多類 Unix 系統和 GNU/Linux 發行版系統日志采集的首選,所以這里重點介紹一下 rsyslog 使用。
一般 rsyslog 的配置文件在 /etc/rsyslog.conf, 其由 3 個部分組成:模塊(MODULES),全局設置(GLOBAL DRICTIVES)和規則(RULE)。這里以 Centos 中 rsyslog 配置為例。
# rsyslog configuration file
# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html
#### 模塊MODULES ####
# The imjournal module bellow is now used as a message source instead of imuxsock.
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imjournal # provides access to the systemd journal
#$ModLoad imklog # reads kernel messages (the same are read from journald)
#$ModLoad immark # provides --MARK-- message capability
# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514
# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514
#### 全局設置GLOBAL DIRECTIVES ####
# Where to place auxiliary files
$WorkDirectory /var/lib/rsyslog
# Use default timestamp format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
# File syncing capability is disabled by default. This feature is usually not required,
# not useful and an extreme performance hit
#$ActionFileEnableSync on
# Include all config files in /etc/rsyslog.d/
$IncludeConfig /etc/rsyslog.d/*.conf
# Turn off message reception via local log socket;
# local messages are retrieved through imjournal now.
$OmitLocalLogging on
# File to store the position in the journal
$IMJournalStateFile imjournal.state
#### 規則RULES ####
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# The authpriv file has restricted access.
authpriv.* /var/log/secure
# Log all the mail messages in one place.
mail.* -/var/log/maillog
# Log cron stuff
cron.* /var/log/cron
# Everybody gets emergency messages
*.emerg :omusrmsg:*
# Save news errors of level crit and higher in a special file.
uucp,news.crit /var/log/spooler
# Save boot messages also to boot.log
local7.* /var/log/boot.log
# ### begin forwarding rule ###
# The statement between the begin ... end define a SINGLE forwarding
# rule. They belong together, do NOT split them. If you create multiple
# forwarding rules, duplicate the whole block!
# Remote Logging (we use TCP for reliable delivery)
#
# An on-disk queue is created for this action. If the remote host is
# down, messages are spooled to disk and sent when it is up again.
#$ActionQueueFileName fwdRule1 # unique name prefix for spool files
#$ActionQueueMaxDiskSpace 1g # 1gb space limit (use as much as possible)
#$ActionQueueSaveOnShutdown on # save messages to disk on shutdown
#$ActionQueueType LinkedList # run asynchronously
#$ActionResumeRetryCount -1 # infinite retries if host is down
# remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional
#*.* @@remote-host:514
# ### end of the forwarding rule ###
每次修改配置文件后可以通過以下操作來判斷配置文件是否合理并重啟 rsyslogd 服務。
# 驗證配置文件 /etc/syslog.conf 是否合理
rsyslogd -f /etc/rsyslog.conf -N1
# 重啟 rsyslog 服務
systemctl restart rsyslog
一般系統都會提供 logger 命令行,可以使用其向系統輸入日志。
# -i 記錄進程id
# -t 標識記錄的tag
# -p 指定消息的設備信息和日志等級,默認user.info
logger -i -t 'hjy_test' -p facility.level 'message'
網上有一篇博文[8]是介紹將 rsyslog 的日志輸出到 mysql 中,當然強大的 rsyslog 不僅支持輸出到 mysql 中,基本覆蓋了所有的主流存儲軟件。 不過這里介紹的實戰是利用 rsyslog 的用戶自定義設備來實現推薦系統的用戶行為收集。大體的思路是推薦請求或數據上報請求通過 nginx 將請求轉發到多臺 online 服務中的一個。 該服務處理完請求后會將推薦的數據或打點上報的數據通過 SyslogHandler 匯總到目標服務器上進行推薦系統用戶行為的統一處理。具體架構見下圖:
優勢如下:
? 速度快,穩定性高,性能好(支持百萬QPS,壓測到十萬級別[9])
? rsyslogd 一般服務器自帶,不需要安裝,只需簡單配置
? 客戶端實現簡單,比如 Python 中 logger 就有 SyslogHandler 來向 rsyslogd 發送日志。
1.rsyslog官網[10]
2.rsyslog源碼[11]
3.維基百科syslog[12]
4.維基百科rsyslog[13]
5.維基百科syslog-ng[14]
6.三種syslog比較[15]
7.rfc3164[16]
8.rfc5424[17]
9.rfc5425[18]
10.rfc5426[19]
11.rsyslog配置[20]
12.記錄rsyslog日志到mysql[21]
13.rsyslog 的 TCP 轉發性能測試[22]
[1] rsyslog: https://en.wikipedia.org/wiki/Rsyslog
[2] syslog: https://zh.wikipedia.org/wiki/Syslog
[3] syslog-ng: https://en.wikipedia.org/wiki/Syslog-ng
[4] RFC 3164: https://tools.ietf.org/html/rfc3164
[5] RFC 5424: https://tools.ietf.org/html/rfc5424
[6] RFC 5425: https://tools.ietf.org/html/rfc5425
[7] RFC 5426: https://tools.ietf.org/html/rfc5426
[8] 博文: https://www.codenong.com/cs105581064/
[9] 壓測到十萬級別: http://chenlinux.com/2015/02/12/rsyslog-forwarder-testing/
天來分享一個有趣的內容,通過 Python + WebSocket + Js 來實現服務監控日志的實時輸出,當服務正常時,在頁面上實時展示出 OK;當服務不正常時,在頁面上會實時展示出加粗的紅色內容。分享的內容劃分成四部分。
第一部分:HTML 部分
如圖所示,紅框的 onclick 方法調用到了 js 方法。
第二部分:JS 部分的代碼
這里會與后端的 WebSocket Server 建立連接,并將 env 這個變量(參數)傳到后端,然后后端會根據 env 來進行服務的檢測,然后返回一個響應給到 js,最后 js 拿到了響應后進行追加到我們定義的一個 div 里面,這里也體現了一個實時的服務日志監控展示。
第三部分:WebSocket Server 部分
這里拿到了前端 js 傳過來的參數 env,進行環境的匹配,然后遍歷每一個服務的請求,再根據請求返回的結果拼接一個 response 給到 js,如下圖紅框中所示:
第四部分:頁面效果展示
總結:
整體上思路要清晰,html 里面通過 onclick 方法調用到 js,js 通過與后端的 WebSocket Server 建立連接,連接后會根據傳入的參數來確定檢測哪個環境的服務,WebSocket Server 將檢測的結果實時返回給 js 處理,js 將結果實時的追加到 html 頁面的一個 div 元素中,至此就全部結束了。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。