2022-05-05
nginx的https配置
#
配置流程
#
- 编译nginx需要带上
--with-http_ssl_module
选项。编译失败可能是缺少依赖,安装对应依赖即可。
./configure --prefix=/opt/nginx --with-http_ssl_module
make
make install
- 生成证书,在控制台中依次执行以下命令,执行完成后将生成的文件移动到/opt/nginx/ssl下。
openssl genrsa -des3 -out uam.key
输入密码:********
再次输入密码:********
openssl req -new -key uam.key -out uam.csr
输入密码:********
依次输入如下
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:shaanxi
Locality Name (eg, city) []:xian
Organization Name (eg, company) [Internet Widgits Pty Ltd]:xiaoxiang
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
openssl rsa -in uam.key -out uam.nopass.key
输入密码:********
openssl req -new -x509 -days 3650 -key uam.nopass.key -out uam.crt
依次输入如下
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:shaanxi
Locality Name (eg, city) []:xian
Organization Name (eg, company) [Internet Widgits Pty Ltd]:xiaoxiang
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
- nginx中http块中添加如下配置:
server {
listen 443 ssl;
#使用https,证书位置
ssl_certificate /opt/nginx/ssl/uam.crt;
ssl_certificate_key /opt/nginx/ssl/uam.nopass.key;
location /{
proxy_pass http://localhost:80;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#http转发到https
error_page 497 https://$host:$server_port$request_uri;
error_page 500 502 503 504 /50x.html;
}
配置介绍
#
https配置
#
- nginx配置https,只有listen后面的
ssl
、ssl_certificate
和ssl_certificate_key
这三个参数是必须的。
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate www.example.com.crt;
ssl_certificate_key www.example.com.key;
...
}
ssl_protocols
和ssl_ciphers
可以限制SSL/TLS的版本和密码,默认情况下nginx会使用ssl_protocols TLSv1 TLSv1.1 TLSv1.2
和ssl_ciphers HIGH:!aNULL:!MD5
,所以一般情况下不需要手动配置。
https优化
#
- SSL会消耗额外的CPU资源,在多核的CPU上应该使
worker_processes
配置为不少于CPU核心数的值(可以将该参数设置为auto,这时nginx会自动调整工作进程数为CPU数量)。
- CPU最密集的行为是SSL握手,有两种方式可以降低握手次数:
- 使用
keepalive_timeout
,使用该参数可以是多个请求通过同一个连接,后面的请求可以复用SSL会话。
- 通过
ssl_session_cache
可以将会话存储到工作进程之间共享的SSL会话缓存中,1MB的缓存可以包含大约4000个会话,默认缓存超时时间为5分钟,可以使用ssl_session_timeout
来设置超时时间。
worker_processes auto;
http {
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
server {
listen 443 ssl;
server_name www.example.com;
keepalive_timeout 70;
ssl_certificate www.example.com.crt;
ssl_certificate_key www.example.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
...
}
一个server中包含http和https
#
- 可以在一个server块中处理http请求和https请求
server {
listen 80;
listen 443 ssl;
server_name www.example.com;
ssl_certificate www.example.com.crt;
ssl_certificate_key www.example.com.key;
...
}
无法使用基于server_name的多个HTTPS服务
#
- 当为一个IP配置了多个域名时,使用server_name并不能区分这些域名所对应的server块。案例如下:
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate www.example.com.crt;
...
}
server {
listen 443 ssl;
server_name www.example.org;
ssl_certificate www.example.org.crt;
...
}
- 这个例子中无论输入哪个域名,浏览器都返回默认的证书(即
www.example.com
的证书)。因为SSL连接是建立在浏览器发送HTTP请求之前,nginx不能知道当前发送请求的是哪个域名,所以它只能返回默认的服务证书。
- 目前的解决方法是为每个HTTPS的server分配一个IP地址。
server {
listen 192.168.1.1:443 ssl;
server_name www.example.com;
ssl_certificate www.example.com.crt;
...
}
server {
listen 192.168.1.2:443 ssl;
server_name www.example.org;
ssl_certificate www.example.org.crt;
...
}
相关链接
Configuring HTTPS servers (nginx.org)
2022-04-05
server_name可以决定使用哪个server块来处理请求,server_name可以是精确的名称、通配符和正则表达式。
server {
listen 80;
server_name example.org www.example.org;
...
}
server {
listen 80;
server_name *.example.org;
...
}
server {
listen 80;
server_name mail.*;
...
}
server {
listen 80;
server_name ~^(?<user>.+)\.example\.net$;
...
}
当按照域名来访问服务时,如果可以匹配多个server_name,就会按照如下的顺序来进行匹配:
- 精确的名称。
- 以星号开头的最长通配符,如
*.exmaple.org
。
- 以星号结束的最长通配符,如
mail.*
。
- 第一个匹配的正则表达式(按照在配置文件出现的先后顺序)。
通配符
#
包含星号的通配符只能出现在name的开始或者结束的地方,且只能在点号.
的旁边。www.*.example.org
和w*.example.org
都是非法的。这种情况下可以使用正则表达式。如~^www\..+\.example\.org$
和~^w.*\.example\.org$
。星号可以匹配name的好几个部分,如*.example.org
不仅可以匹配www.example.org
也可以匹配www.sub.example.org
。
如.example.org
这种特殊格式的通配符不仅可以匹配example.org
,还可以匹配通配符*.example.org
。
正则表达式
#
nginx使用的正则表达式和Perl编程语言(即PCRE)兼容。如果要使用正则表达式,server_name必须以波浪线开始。
server_name ~^www\d+\.example\.net$;`
如果不以波浪线开头,它会被认为是一个精确的名称,如果表达式中包含星号,它会被认为是一个通配符名称。^
和$
在逻辑上是必须要有的。域名中的.
需要被转义,因为.
也是正则的元字符。当正则表达式中包含{
和}
时,正则需要被括起来。
server_name "~^(?<name>\w\d{1,3}+)\.example\.net$";
否则nginx在启动时会报错。
命名正则表达式捕获组可以当作一个变量使用:
server {
server_name ~^(www\.)?(?<domain>.+)$;
location / {
root /sites/$domain;
}
}
PCRE支持下面这几种语法
?<name>
和?'name'
Perl5.10兼容语法,自PCRE-7.0开始支持。
?P<name>
Python兼容依法,自PCRE-4.0开始支持。
当nginx启动失败并显示以下错误时:
pcre_compile() failed: unrecognized character after (?< in ...
这表示PCRE库版本太久,可以使用?P<name>
语法代替。捕获组也可以使用数字形式。
server {
server_name ~^(www\.)?(.+)$;
location / {
root /sites/$2;
}
}
然而,这种用法仅限于简单的情况,因为数字引用很容易被覆盖。
2022-01-31
基本语法
#
-
变量如果只声明而没有赋值,则该变量的值是undefined
。
-
js是一种动态类型语言,变量的类型没有限制,变量可以随时更改类型。
-
js引擎的工作方式是先解析代码,获取所有被声明的变量,然后再一行行的运行,这会使得所有变量的声明语句,都会被提升到代码的头部。
-
变量命名规则如下:第一个字符可以是任意Unicode字母以及$
和_
,第二个字符及后面的字符还可以用数字0-9。
if…else
#
if (m === 3) {
// 满足条件时,执行的语句
} else {
// 不满足条件时,执行的语句
}
switch
#
switch
语句后面的表达式,与case
语句后面的表示式比较运行结果时,采用的是严格相等运算符(===
),这意味着比较时不会发生类型转换。
switch (x) {
case 1:
console.log('x 等于1');
break;
case 2:
console.log('x 等于2');
break;
default:
console.log('x 等于其他值');
}
三元运算符
#
循环语句
#
while
#
var i = 0;
while (i < 100) {
console.log('i 当前为:' + i);
i = i + 1;
}
for
#
var x = 3;
for (var i = 0; i < x; i++) {
console.log(i);
}
do…while
#
var x = 3;
var i = 0;
do {
console.log(i);
i++;
} while(i < x);
break和continue
#
for (var i = 0; i < 5; i++) {
console.log(i);
if (i === 3)
break;
}
var i = 0;
while (i < 100){
i++;
if (i % 2 === 0) {
continue;
}
console.log('i 当前为:' + i);
}
数据类型
#
六种数据类型
#
- 数值(number):整数和小数(比如
1
和3.14
)。
- 字符串(string):文本(比如
Hello World
)。
- 布尔值(boolean):表示真伪的两个特殊值,即
true
(真)和false
(假)。
undefined
:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值。
null
:表示空值,即此处的值为空。
- 对象(object):各种值组成的集合。
typeof运算符
#
typeof
运算符可以返回一个值的数据类型。
数值、字符串、布尔值分别返回number
、string
、boolean
。
typeof 123 // "number"
typeof '123' // "string"
typeof false // "boolean"
函数返回function
。
undefined
返回undefined
。
typeof undefined
// "undefined"
typeof
可以用来检查一个没有声明的变量,而不报错。
对象返回object
。
typeof window // "object"
null
返回object
。
空数组([]
)的类型也是object
,在 JavaScript 内部,数组本质上只是一种特殊的对象。
null、undefined和布尔值
#
布尔值
#
下面的值都会被转为false
。
undefined
null
false
0
NaN
""
或''
(空字符串)
空数组([]
)和空对象({}
)对应的布尔值,都是true
。
数值
#
整数和浮点数
#
JavaScript 内部,所有数字都是以64位浮点数形式储存,即使整数也是如此。所以,1
与1.0
是相同的,是同一个数。
数值的表示方法
#
JavaScript 的数值有多种表示方法,默认情况下,JavaScript 内部会自动将八进制、十六进制、二进制转为十进制。
- 十进制:没有前导0的数值。
- 八进制:有前缀
0o
或0O
的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。
- 十六进制:有前缀
0x
或0X
的数值。
- 二进制:有前缀
0b
或0B
的数值。
0xff // 255
0o377 // 255
0b11 // 3
数值也可以采用科学计数法表示,下面是几个科学计数法的例子。
123e3 // 123000
123e-3 // 0.123
-3.1E+12
.1e-23
NaN
#
NaN
是 JavaScript 的特殊值,表示“非数字”(Not a Number),主要出现在将字符串解析成数字出错的场合。
5 - 'x' // NaN
NaN
不是独立的数据类型,而是一个特殊数值,它的数据类型依然属于Number
,使用typeof
运算符可以看得很清楚。
NaN
不等于任何值,包括它本身。
Infinity
#
Infinity表示“无穷”,用来表示两种场景。一种是一个正的数值太大,或一个负的数值太小,无法表示;另一种是非0数值除以0,得到Infinity。
Infinity
有正负之分,Infinity
表示正的无穷,-Infinity
表示负的无穷。
Infinity
大于一切数值(除了NaN
),-Infinity
小于一切数值(除了NaN
)。
Infinity
的四则运算,符合无穷的数学计算规则。
5 * Infinity // Infinity
5 - Infinity // -Infinity
Infinity / 5 // Infinity
5 / Infinity // 0
相关函数
#
parseInt
#
parseInt
方法用于将字符串转为整数。
如果字符串头部有空格,空格会被自动去除。
如果parseInt
的参数不是字符串,则会先转为字符串再转换。
parseInt(1.23) // 1
// 等同于
parseInt('1.23') // 1
字符串转为整数的时候,是一个个字符依次转换,如果遇到不能转为数字的字符,就不再进行下去,返回已经转好的部分。
parseInt('8a') // 8
parseInt('12**') // 12
parseInt('12.34') // 12
parseInt('15e2') // 15
parseInt('15px') // 15
如果字符串的第一个字符不能转化为数字(后面跟着数字的正负号除外),返回NaN
。
parseInt('abc') // NaN
parseInt('+1') // 1
对于那些会自动转为科学计数法的数字,parseInt
会将科学计数法的表示方法视为字符串,因此导致一些奇怪的结果。
parseInt(1000000000000000000000.5) // 1
// 等同于
parseInt('1e+21') // 1
parseFloat
#
parseFloat
方法用于将一个字符串转为浮点数。
parseFloat('3.14') // 3.14
如果字符串符合科学计数法,则会进行相应的转换。
parseFloat('314e-2') // 3.14
parseFloat('0.0314E+2') // 3.14
如果字符串包含不能转为浮点数的字符,则不再进行往后转换,返回已经转好的部分。
parseFloat('3.14more non-digit characters') // 3.14
parseFloat
方法会自动过滤字符串前导的空格。
parseFloat('\t\v\r12.34\n ') // 12.34
如果参数不是字符串,或者字符串的第一个字符不能转化为浮点数,则返回NaN
。
parseFloat([]) // NaN
parseFloat('') // NaN
isNaN
#
isNaN
方法可以用来判断一个值是否为NaN
。
isNaN(NaN) // true
isNaN(123) // false
但是,isNaN
只对数值有效,如果传入其他值,会被先转成数值。比如,传入字符串的时候,字符串会被先转成NaN
,所以最后返回true
,isNaN
为true
的值,有可能不是NaN
,而是一个字符串。
判断NaN
更可靠的方法是,利用NaN
为唯一不等于自身的值的这个特点,进行判断。
function myIsNaN(value) {
return value !== value;
}
isFinite
#
isFinite
方法返回一个布尔值,表示某个值是否为正常的数值。
isFinite(Infinity) // false
isFinite(-Infinity) // false
isFinite(NaN) // false
isFinite(undefined) // false
isFinite(null) // true
isFinite(-1) // true
字符串
#
字符串就是零个或多个排在一起的字符,放在单引号或双引号之中。
字符串可以被视为字符数组,因此可以使用数组的方括号运算符,用来返回某个位置的字符(位置编号从0开始)。但无法改变字符串之中的单个字符。
var s = 'hello';
s[0] // "h"
length
#
length
属性返回字符串的长度。
var s = 'hello';
s.length // 5
对象
#
对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。
var obj = {
foo: 'Hello',
bar: 'World'
};
对象的所有键都是字符串,所以加不加引号都可以。
var obj = {
'foo': 'Hello',
'bar': 'World'
};
对象的每一个键又称为“属性”(property),它的“键值”可以是任何数据类型。如果一个属性的值为函数,通常把这个属性称为“方法”,它可以像函数那样调用。
var obj = {
p: function (x) {
return 2 * x;
}
};
obj.p(1) // 2
属性可以动态创建,不必在对象声明时就指定。
var obj = {};
obj.foo = 123;
obj.foo // 123
对象引用
#
如果不同的变量名指向同一个对象,那么它们都是这个对象的引用,也就是说指向同一个内存地址。修改其中一个变量,会影响到其他所有变量。
对象属性
#
读取对象的属性,有两种方法,一种是使用点运算符,还有一种是使用方括号运算符。
var obj = {
p: 'Hello World'
};
obj.p // "Hello World"
//如果使用方括号运算符,键名必须放在引号里面
obj['p'] // "Hello World"
点运算符和方括号运算符,不仅可以用来读取值,还可以用来赋值。
var obj = {};
obj.foo = 'Hello';
obj['bar'] = 'World';
属性的查看
#
查看一个对象本身的所有属性,可以使用Object.keys
方法。
var obj = {
key1: 1,
key2: 2
};
Object.keys(obj);
属性的删除
#
delete
命令用于删除对象的属性,删除成功后返回true
。
删除一个不存在的属性,delete
不报错,而且返回true
。
var obj = { p: 1 };
Object.keys(obj) // ["p"]
delete obj.p // true
属性是否存在:in 运算符
#
in
运算符用于检查对象是否包含某个属性。
var obj = { p: 1 };
'p' in obj // true
'toString' in obj // true
属性的遍历:for…in 循环
#
for...in
循环用来遍历一个对象的全部属性。
var obj = {a: 1, b: 2, c: 3};
for (var i in obj) {
console.log('键名:', i);
console.log('键值:', obj[i]);
}
for...in
循环有两个使用注意点。
- 它遍历的是对象所有可遍历(enumerable)的属性,会跳过不可遍历的属性。
- 它不仅遍历对象自身的属性,还遍历继承的属性。
函数
#
function
#
function
命令声明的代码区块,就是一个函数。function
命令后面是函数名,函数名后面是一对圆括号,里面是传入函数的参数。函数体放在大括号里面。
function print(s) {
console.log(s);
}
函数表达式
#
除了用function
命令声明函数,还可以采用变量赋值的写法。
var print = function(s) {
console.log(s);
};
name属性
#
函数的name
属性返回函数的名字。
function f1() {}
f1.name // "f1"
数组
#
var arr = ['a', 'b', 'c'];
//除了在定义时赋值,数组也可以先定义后赋值。
//任何类型的数据,都可以放入数组。
var arr = [];
arr[0] = 'a';
arr[1] = [1, 2, 3];
arr[2] = {a: 1};
数组属于一种特殊的对象。typeof
运算符会返回数组的类型是object
。
Object.keys
方法返回数组的所有键名。可以看到数组的键名就是整数0、1、2。
JavaScript 语言规定,对象的键名一律为字符串,所以,数组的键名其实也是字符串。
length 属性
#
数组的length
属性,返回数组的成员数量。
['a', 'b', 'c'].length // 3
for…in 循环
#
var a = [1, 2, 3];
for (var i in a) {
console.log(a[i]);
}
2022-01-15
- es是面向文档型数据库,一条数据在这里就是一条文档。
索引
#
- 创建索引
PUT http://ip:9200/索引名称
。
- 获取索引的相关信息
GET http://ip:9200/索引名称
。
- 获取所有的索引
GET http://ip:9200/_cat/indices?v
。
- 删除索引
DELETE http://ip:9200/索引名称
。
文档
#
添加文档
#
POST /索引名称/_doc
{
"title": "xiaoxiang",
"url": "xiaoxiang.space"
}
PUT /索引名称/_doc/id
{
"title": "xiaoxiang",
"url": "xiaoxiang.space"
}
PUT /<target>/_doc/<_id>
POST /<target>/_doc/
PUT /<target>/_create/<_id>
POST /<target>/_create/<_id>
查询数据
#
//查询一条数据
GET /索引名称/_doc/id
//全部查询
GET /索引名称/_search?pretty
修改数据
#
POST /索引名称/_update/12
{
"doc": {
"title": "xiaoxiangmax"
}
}
#可以使用PUT进行数据修改,但需要罗列所有的字段
PUT my_goods/_doc/10
{
"goodsName": "三星 UA55RU7520JXXZ 52 英寸 4K 超高清",
"skuCode": "skuCode10",
...
}
删除数据
#
DELETE /索引名称/_doc/id
#查询删除
POST /my_goods/_delete_by_query
{
"query": {
"match": {
"shopCode": "sc00002"
}
}
}
文档复杂查询
#
添加查询条件
#
//增加条件查询
GET /索引名称/_search
{
"query": {
"match": {
"category": "xiaoxiang"
}
}
}
//不拆解搜索字段
GET /gw_audit-*/_search
{
"query": {
"bool": {
"must": [
{
"match_phrase": {
"user_name": "zhao fei"
}
}
]
}
}
}
添加高亮显示
#
//对某个条件添加高亮显示
GET /gw_audit-*/_search
{
"query": {
"bool": {
"must": [
{
"match_phrase": {
"user_name": "kpf"
}
}
]
}
},
"highlight": {
"fields": {
"user_name": {}
}
}
}
多条件查询
#
//多条件查询,(相当于and)
{
"query": {
"bool": {
"must": [
{
"match": {
"category": "xiaoxiang"
}
},
{
"match": {
"price": "5999"
}
}
]
}
}
}
//多条件查询,一个字段多个查询的值(相当于or)
GET /gw_audit-*/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"user_name": "kpf"
}
},
{
"match": {
"user_name": "zj"
}
}
]
}
},
"size": 20000
}
区间查询
#
#区间查询
GET /gw_audit-*/_search
{
"query": {
"bool": {
"filter": [
{
"range": {
"spent": {
"gte": 10,
"lte": 200
}
}
}
]
}
}
}
分页查询
#
//全量分页查询
GET /gw_audit-*/_search
{
"query": {
"match_all": {
}
},
"from": 0,
"size": 10
}
只查询指定字段
#
//只查询指定字段
GET /索引名称/_search
{
"query": {
"match_all": {
}
},
"from": 0,
"size": 10,
"_source": ["title"]
}
对结果排序
#
//对结果排序
GET /索引名称/_search
{
"query": {
"match_all": {
}
},
"from": 0,
"size": 10,
"sort": {
"price": {
"order": "desc"
}
}
}
聚合操作,求每组的数量
#
#对查询结果进行聚合操作,统计每一组的数量
GET /gw_audit-*/_search
{
"aggs": {
"user_name_group": {
"terms": {
"field": "user_name"
}
}
},
"size": 0
}
聚合操作,统计平均值
#
#对查询结果进行聚合操作,统计平均值
GET /gw_audit-*/_search
{
"aggs": {
"user_name_avg": {
"avg": {
"field": "spent"
}
}
},
"size": 0
}
设置映射关系
#
//设置映射关系
PUT test/_mapping
{
"properties": {
"name": {
"type": "text",
"index": true
},
"sex": {
"type": "keyword", //关键字不会被分开
"index": "true"
},
"tel": {
"type": "keyword",
"index": false
}
}
}
_reindex
#
PUT cpu-2022
{
"mappings": {
"dynamic": "false",
"properties": {
"cpu": {
"type": "keyword"
},
"host_name": {
"type": "keyword"
}
}
}
}
POST _reindex
{
"source": {
"index": "cpu-2022.07.*"
},
"dest": {
"index": "cpu-2022"
}
}
DELETE cpu-2022.07.*
GET cpu-2022/_search
{
"size": 0,
"track_total_hits": true
}
2022-01-07
rfc5424
#
介绍
#
格式:PRI VERSION TIMESTAMP HOSTNAME APP-NAME PROCID MSGID STRUCTURED-DATA MSG
- 消息头
- PRI 优先级
- VERSION 版本
- TIMESTAMP 时间
- HOSTNAME 主机名
- APP-NAME APP名称
- PROCID 进程的ID
- MSGID 消息ID
- STRUCTURED-DATA
- 消息体
PRI
#
- PRI(priority)代表两个值(Facility)和日志级别(serverity)。PRI必须是类似
<14>
的格式。中间的值的计算公式为priority = facility x 8 + serverity
。
- Facility的值是
[0,23]
。各个值的含义如下:
数字 |
介绍 |
0 |
内核消息 |
1 |
用户级别消息 |
2 |
邮件系统 |
3 |
系统守护进程 |
4 |
安全/认证消息 |
5 |
syslogd内部生成的消息 |
6 |
line printer subsystem |
7 |
network news subsystem |
8 |
UUCP subsystem |
9 |
时钟守护程序 |
10 |
安全/认证消息 |
11 |
FTP守护程序 |
12 |
NTF子系统 |
13 |
log audit |
14 |
log alert |
15 |
clock daemon (note 2) |
16 |
本地用户0(LOCAL0) |
17 |
本地用户1(LOCAL1) |
18 |
本地用户2(LOCAL2) |
19 |
本地用户3(LOCAL3) |
20 |
本地用户4(LOCAL4) |
21 |
本地用户5(LOCAL5) |
22 |
本地用户6(LOCAL6) |
23 |
本地用户7(LOCAL7) |
Serverity
#
数字 |
介绍 |
0 |
emergency紧急,系统无法使用 |
1 |
alert警告,必须立即采取措施 |
2 |
critical |
3 |
error |
4 |
warning |
5 |
notice;正常但是重要的情况 |
6 |
informational;普通信息 |
7 |
debug; |
例子
#
<165>1 2003-08-24T05:14:15.000003-07:00 192.0.2.1 myproc 8710 - - %% It's time to make the do-nuts
<165>1 2003-10-11T22:14:15.003Z mymachine.example.com evntslog - ID47 [exampleSDID@32473 iut="3" eventSource="Application" eventID="1011"] BOMAn
<165>1 2003-10-11T22:14:15.003Z mymachine.example.com evntslog - ID47 [exampleSDID@32473 iut="3" eventSource="Application" eventID="1011"][examplePriority@32473 class="high"]
log4j2配置
#
<Syslog name="RFC5424" format="RFC5424" host="10.2.4.31" port="5140" protocol="UDP"
appName="auditSyslogDemo" facility="LOCAL0" newLine="true" messageId="Audit" id="App"/>
参考链接:
RFC 5424: The Syslog Protocol (rfc-editor.org)
参考链接:
Log4j – Log4j 2 Appenders (apache.org)