Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
.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文件第一行打出“!”便會自動得到這些代碼。我們來認(rèn)識一下這些標(biāo)簽都是什么。
<!DOCTYPE html>
html文件第一行必須是DTD(Document Type Definition,文檔類型聲明),不寫DTD會引發(fā)瀏覽器的一些兼容問題。
<html lang="en">
.
.
.
</html>
<html></html>標(biāo)簽對,將<head></head>標(biāo)簽對和<body></body>標(biāo)簽對放入其中,lang屬性為網(wǎng)頁語言,英語為en,中文為zh。
注意:head標(biāo)簽對和body標(biāo)簽對需要在html標(biāo)簽對中縮進(jìn)
<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>標(biāo)簽對中是網(wǎng)頁的配置,而并非網(wǎng)頁頭部
head標(biāo)簽對中<meta charset="UTF-8">為設(shè)置字符集,<meta>標(biāo)簽為元標(biāo)簽,表示網(wǎng)頁的基礎(chǔ)配置;
UTF-8為制作網(wǎng)頁所使用的字符集,與gb2312的區(qū)別可參考下圖。
在<head></head>中的<title></title>中書寫網(wǎng)頁的標(biāo)題,文字會顯示在瀏覽器的標(biāo)簽欄上。title也是搜索引擎收錄網(wǎng)站時顯示的標(biāo)題,所以我們需要合理的設(shè)置title以吸引用戶的點擊。
使用meta標(biāo)簽設(shè)置網(wǎng)頁關(guān)鍵詞和描述,name屬性非常關(guān)鍵,用來設(shè)置meta的具體功能。
<meta name="Keywords" content="關(guān)鍵詞1,關(guān)鍵詞2,關(guān)鍵詞3">
<meta name="Description" content="頁面描述是搜索引擎顯示的簡介詞語">
<body></body>標(biāo)簽對中用來寫網(wǎng)頁的主要內(nèi)容,包括網(wǎng)頁頭部,內(nèi)容,頁腳等等。
2、標(biāo)簽
html叫做“超文本標(biāo)記語言”,超文本標(biāo)記就是標(biāo)簽,這些標(biāo)簽擁有不同的功能。
標(biāo)簽通常成對兒出現(xiàn);但meta標(biāo)簽為單標(biāo)簽,只有起始標(biāo)簽。
標(biāo)簽可以給文字設(shè)置不同的“語義”。
1.標(biāo)題標(biāo)簽
<h1>一級標(biāo)題</h1><h2>二級標(biāo)題</h2><h3>三級標(biāo)題</h3><h4>四級標(biāo)題</h4><h5>五級標(biāo)題</h5> <h6>六級標(biāo)題</h6>
實際顯示效果如圖。
搜索引擎非常看重<h1></h1>標(biāo)簽的內(nèi)容,應(yīng)該將重點內(nèi)容比如網(wǎng)頁的logo等放到<h1></h1>中以加大其權(quán)重。<h1></h1>標(biāo)簽一般只能放置一個,否則會被搜索引擎視為作弊。
六級標(biāo)題雖然很像普通文本進(jìn)行了加粗,但不應(yīng)該僅僅為了加粗而使用<h6></h6>標(biāo)簽對。
2.段落標(biāo)簽——p標(biāo)簽對
<p>段落標(biāo)簽,p是英語paragraph的意思</p><p>在HTML文件中即使代碼換行了,頁面顯示效果也不會換行</p><p>所以必須要把任何段落都放入段落標(biāo)簽中</p> <p>段落標(biāo)簽中不能嵌套標(biāo)題標(biāo)簽和其他段落標(biāo)簽</p>
在網(wǎng)頁中顯示的效果如圖。
3.div標(biāo)簽
div是英語division“分割”的縮寫,<div></div>標(biāo)簽對用來將相關(guān)的內(nèi)容組合到一起,以和其
他內(nèi)容分割,使文檔結(jié)構(gòu)更清晰。最重要的一點是,它可以結(jié)合CSS使用,實現(xiàn)網(wǎng)頁的布局,這種布局形式叫做“DIV+CSS”。
div標(biāo)簽對的應(yīng)用是html中非常重要的知識點。
<div>
<h3>標(biāo)題三</h3>
<p>段落1</p>
<p>段落2</p>
<p>段落3</p>
</div>
4.注釋與轉(zhuǎn)義字符
書寫代碼時,我們需要寫好注釋使日后再閱讀代碼或者他人閱讀代碼提供提示。
為了在書寫“<”“>”等符號時不被當(dāng)作標(biāo)簽,我們需要使用轉(zhuǎn)義字符來表示它們。
<!-- 注釋內(nèi)容 -->
<p><為小于號</p>
<p>>為大于號</p>
<p> 為不會被折疊的空格</p>
<p>?為版權(quán)符號</p>
在網(wǎng)頁中顯示的效果如圖。
總結(jié)
通過此次的學(xué)習(xí),我們認(rèn)識了html骨架,標(biāo)題標(biāo)簽,段落標(biāo)簽,div標(biāo)簽,注釋寫法與部分轉(zhuǎn)義字符寫法。下次的學(xué)習(xí)內(nèi)容將會是列表標(biāo)簽和多媒體語義化標(biāo)簽。
統(tǒng)內(nèi)核和許多程序會產(chǎn)生各種錯誤信息、警告信息和其他的提示信息,這些信息對用戶了解系統(tǒng)的運(yùn)行狀態(tài)是非常有用的,所以需要把它們保存到對應(yīng)的日志文件中,以便后續(xù)進(jìn)行分析和監(jiān)控系統(tǒng)或軟件的狀態(tài)。 Linux 系統(tǒng)擁有非常靈活和強(qiáng)大的日志功能,幾乎可以保存所有的操作記錄,并可以從中檢索出我們需要的信息。完成這個工作的守護(hù)進(jìn)程就是 rsyslog。
談及 rsyslog[1],就不可避免的涉及另外兩個軟件 syslog[2] 和 syslog-ng[3]。這三款軟件設(shè)計的目標(biāo)是一樣的,就是解決系統(tǒng)和程序的日志收集問題。每一個項目都在試圖提高前者的穩(wěn)定性和功能性。
syslog 由 Eric Allman 在 1980 年代開發(fā),是 Sendmail 項目的一部分。因為它的易用性被很多類 Unix 系統(tǒng)使用,成為其標(biāo)準(zhǔn)的日志記錄解決方案。在這個過程中,它演變成一種協(xié)議,成為在互聯(lián)網(wǎng)協(xié)議(TCP/IP)的網(wǎng)絡(luò)中傳遞記錄檔消息的標(biāo)準(zhǔn)。
syslog 協(xié)議屬于一種主從式協(xié)議:syslog 發(fā)送端會發(fā)送出一個小的文字消息(小于 1024 位組)到 syslog 接收端。接收端通常名為 syslogd、syslog daemon 或 syslog 服務(wù)器。系統(tǒng)日志消息可以被以 UDP 協(xié)議或 TCP 協(xié)議來發(fā)送。這些資料是以明碼類型被發(fā)送。不過由于 SSL 加密外套(例如 Stunnel、sslio 或 sslwrap 等)并非 syslog 協(xié)議本身的一部分,因此可以被用來透過SSL/TLS 方式提供一層加密。
syslog-ng 是 syslog NextGeneration 的簡寫。該項目發(fā)起于 1998 年并基于 syslog 協(xié)議開發(fā)。作為 syslog 的下一代產(chǎn)品,功能肯定比 syslog 強(qiáng)大的多,如高性能,可靠的傳輸,支持多平臺,高可靠性,眾多的用戶群體,強(qiáng)大的日志過濾及排序,事件標(biāo)簽和關(guān)聯(lián)性,支持最新的IETF標(biāo)準(zhǔn)等。
rsyslog 是 the rocket-fast system for log processing 的簡寫。該項目始于 2004 年,當(dāng)時 rsyslog 的主要作者 Rainer Gerhards 決定編寫一個新的強(qiáng)大 syslog 守護(hù)程序來與 syslog-ng 競爭。它實現(xiàn)了基本的 syslog 協(xié)議,并擴(kuò)展了基于內(nèi)容的過濾功能,豐富了過濾能力,處理脫機(jī)輸出的隊列操作,支持不同模塊的輸出,配置選項更加靈活,并添加了使用 TCP 進(jìn)行傳輸?shù)墓δ堋?/p>
由于 rsyslog 的高性能,出色的安全性和模塊化設(shè)計,它不僅作為常規(guī)的系統(tǒng)日志收集工具,還能夠接受各種來源的輸入,將其轉(zhuǎn)換,然后將結(jié)果輸出到不同的目的地。
它的優(yōu)勢有如下:
? 高性能(使用 C 編寫,運(yùn)用多線程)
? 支持 TCP, SSL, TLS, RELP
? 支持多種輸出(MySQL, PostgreSQL等)
? 支持對系統(tǒng)日志的過濾
? 靈活配置多種輸出
正因為如此,它是眾多類 Unix 系統(tǒng)和 GNU/Linux 發(fā)行版系統(tǒng)日志采集的首選。
既然三款軟件都基于 syslog 協(xié)議,那就先來介紹一下 syslog 協(xié)議。相關(guān) RFC 文件有 2001 年發(fā)行的RFC 3164[4](The BSD syslog Protocol), 2009 年發(fā)行的 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 已經(jīng)被 RFC 5424 廢除,所以下面介紹的以 RFC 5424 為準(zhǔn)。
Syslog 協(xié)議使用三層結(jié)構(gòu),第一層是消息層,指要傳輸?shù)男畔ⅲ坏诙邮菓?yīng)用層,主要用于消息的生成,解析,路由和存儲,代表有發(fā)送者,中繼器和接受者。第三層是傳輸層,主要用于發(fā)送和接收網(wǎng)絡(luò)上的信息,代表有發(fā)送設(shè)備和接收設(shè)備。 具體的層次結(jié)構(gòu)見下圖(這塊的理解可以參考 OSI 7層模型或 TCP/IP 4層模型):
syslog 協(xié)議遵循以下的原則:
? 協(xié)議沒有信息確認(rèn)機(jī)制 消息從發(fā)送者發(fā)送到接受者的 UDP 514 端口,不需要接收方應(yīng)答。
? 發(fā)送者和中繼器可以將相同的消息發(fā)送給多個接收者和中繼器
? 發(fā)送者,中繼器和接收者可以部署在同一個系統(tǒng)上。
按照上述原則,有如下圖的部署場景。
syslog 協(xié)議定義了消息格式,由三部分組成:消息頭 HEADER ,結(jié)構(gòu)化數(shù)據(jù) STRUCTURED-DATA 和消息 MSG(可選)。其中消息頭又包含優(yōu)先級(PRIority),版本號(VERSION),時間戳(TIMESTAMP),主機(jī)名(HOSTNAME), 應(yīng)用名(APP-NAME),進(jìn)程標(biāo)識(PROCID)和消息標(biāo)識(MSGID)。
其中優(yōu)先級由設(shè)備(Facility)和嚴(yán)重性(Severity)共同決定。PRI=Facility * 8 + Severity。 設(shè)備的可選值有以下24個:
代號 | 設(shè)備(Facility) | 注釋 |
0 | kernel messages | 內(nèi)核相關(guān) |
1 | user-level messages | 用戶相關(guān)(默認(rèn)) |
2 | mail system | 郵件相關(guān) |
3 | system daemons | 系統(tǒng)守護(hù)進(jìn)程相關(guān) |
4 | security/authorization messages (note 1) | 登陸授權(quán)相關(guān) |
5 | messages generated internally by syslogd | syslogd相關(guān) |
6 | line printer subsystem | 打印相關(guān) |
7 | network news subsystem | 新聞相關(guān) |
8 | UUCP subsystem | unix到unix的cp相關(guān) |
9 | clock daemon (note 2) | 任務(wù)計劃相關(guān) |
10 | security/authorization messages (note 1) | 登陸授權(quán)相關(guān) |
11 | FTP daemon | FTP相關(guān) |
12 | NTP subsystem | |
13 | log audit (note 1) | 登陸授權(quán)相關(guān) |
14 | log alert (note 1) | 登陸授權(quán)相關(guān) |
15 | clock daemon (note 2) | 任務(wù)計劃相關(guān) |
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 |
嚴(yán)重性的可選值有以下8個,這也是Facility * 8的原因:
代號 | 嚴(yán)重性(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 | 調(diào)試級別 |
? 協(xié)議的實現(xiàn)必須支持基于 TLS 的傳輸,應(yīng)該支持基于 UDP 的傳輸
? 所有接收設(shè)備必須能夠結(jié)構(gòu)長度不超過480個八位字節(jié)的消息,應(yīng)該接收長度最大為2048個八位字節(jié)的消息,可以接收超過2048個八位字節(jié)的消息(可以截斷或丟棄)。
鑒于 rsyslog 已經(jīng)是眾多類 Unix 系統(tǒng)和 GNU/Linux 發(fā)行版系統(tǒng)日志采集的首選,所以這里重點介紹一下 rsyslog 使用。
一般 rsyslog 的配置文件在 /etc/rsyslog.conf, 其由 3 個部分組成:模塊(MODULES),全局設(shè)置(GLOBAL DRICTIVES)和規(guī)則(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
#### 全局設(shè)置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
#### 規(guī)則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 服務(wù)。
# 驗證配置文件 /etc/syslog.conf 是否合理
rsyslogd -f /etc/rsyslog.conf -N1
# 重啟 rsyslog 服務(wù)
systemctl restart rsyslog
一般系統(tǒng)都會提供 logger 命令行,可以使用其向系統(tǒng)輸入日志。
# -i 記錄進(jìn)程id
# -t 標(biāo)識記錄的tag
# -p 指定消息的設(shè)備信息和日志等級,默認(rèn)user.info
logger -i -t 'hjy_test' -p facility.level 'message'
網(wǎng)上有一篇博文[8]是介紹將 rsyslog 的日志輸出到 mysql 中,當(dāng)然強(qiáng)大的 rsyslog 不僅支持輸出到 mysql 中,基本覆蓋了所有的主流存儲軟件。 不過這里介紹的實戰(zhàn)是利用 rsyslog 的用戶自定義設(shè)備來實現(xiàn)推薦系統(tǒng)的用戶行為收集。大體的思路是推薦請求或數(shù)據(jù)上報請求通過 nginx 將請求轉(zhuǎn)發(fā)到多臺 online 服務(wù)中的一個。 該服務(wù)處理完請求后會將推薦的數(shù)據(jù)或打點上報的數(shù)據(jù)通過 SyslogHandler 匯總到目標(biāo)服務(wù)器上進(jìn)行推薦系統(tǒng)用戶行為的統(tǒng)一處理。具體架構(gòu)見下圖:
優(yōu)勢如下:
? 速度快,穩(wěn)定性高,性能好(支持百萬QPS,壓測到十萬級別[9])
? rsyslogd 一般服務(wù)器自帶,不需要安裝,只需簡單配置
? 客戶端實現(xiàn)簡單,比如 Python 中 logger 就有 SyslogHandler 來向 rsyslogd 發(fā)送日志。
1.rsyslog官網(wǎng)[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 轉(zhuǎn)發(fā)性能測試[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/
天來分享一個有趣的內(nèi)容,通過 Python + WebSocket + Js 來實現(xiàn)服務(wù)監(jiān)控日志的實時輸出,當(dāng)服務(wù)正常時,在頁面上實時展示出 OK;當(dāng)服務(wù)不正常時,在頁面上會實時展示出加粗的紅色內(nèi)容。分享的內(nèi)容劃分成四部分。
第一部分:HTML 部分
如圖所示,紅框的 onclick 方法調(diào)用到了 js 方法。
第二部分:JS 部分的代碼
這里會與后端的 WebSocket Server 建立連接,并將 env 這個變量(參數(shù))傳到后端,然后后端會根據(jù) env 來進(jìn)行服務(wù)的檢測,然后返回一個響應(yīng)給到 js,最后 js 拿到了響應(yīng)后進(jìn)行追加到我們定義的一個 div 里面,這里也體現(xiàn)了一個實時的服務(wù)日志監(jiān)控展示。
第三部分:WebSocket Server 部分
這里拿到了前端 js 傳過來的參數(shù) env,進(jìn)行環(huán)境的匹配,然后遍歷每一個服務(wù)的請求,再根據(jù)請求返回的結(jié)果拼接一個 response 給到 js,如下圖紅框中所示:
第四部分:頁面效果展示
總結(jié):
整體上思路要清晰,html 里面通過 onclick 方法調(diào)用到 js,js 通過與后端的 WebSocket Server 建立連接,連接后會根據(jù)傳入的參數(shù)來確定檢測哪個環(huán)境的服務(wù),WebSocket Server 將檢測的結(jié)果實時返回給 js 處理,js 將結(jié)果實時的追加到 html 頁面的一個 div 元素中,至此就全部結(jié)束了。
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。