【ELK使用指南 2】常用的 Logstash filter 插件详解(附应用实例)

news2024/11/18 23:39:20

Logstash filter

  • 一、logstash filter过滤插件的常用模块简介
  • 二、grok 正则捕获插件
    • 2.1 grok插件的作用
    • 2.2 内置正则表达式
    • 2.3 自定义正则表达式
  • 三、mutate 数据修改插件
    • 3.1 mutate插件的作用
    • 3.2 常用的配置选项
    • 3.3 mutate插件应用实例
  • 四、multiline 多行合并插件
    • 4.1 multiline插件的作用
    • 4.2 常用配置项
    • 4.3 multiline插件应用实例
      • Step1 安装multiline插件
      • Step2 使用multiline插件
  • 五、date 时间处理插件
    • 5.1 date插件的作用
    • 5.2 常用的配置项
    • 5.3 date插件应用实例

一、logstash filter过滤插件的常用模块简介

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Logstash 中的 filter 模块用于对输入的数据进行处理和转换

它提供了多个插件,可以根据需要选择适当的插件来应用于数据流。

常见的 Logstash filter 插件包括:

  1. grok:用于将非结构化的日志数据解析为结构化的数据。它使用自定义的正则表达式模式匹配和提取字段。
  2. mutate:用于修改事件中的字段,例如重命名字段、删除字段、添加字段、替换字段值等。
  3. date:用于解析日期和时间字段,并将其转换为特定的格式。
  4. geoip:根据 IP 地址解析并添加地理位置信息字段,例如国家、省份、城市等。
  5. dns:根据域名解析并添加 IP 地址信息字段,例如解析主机名到 IP 地址。
  6. json:用于解析和格式化 JSON 数据。
  7. csv:用于解析和格式化 CSV 数据。
  8. grokdiscovery:用于动态生成 grok 模式,这对于处理多种日志格式非常有用。

二、grok 正则捕获插件

2.1 grok插件的作用

将大文本字段分片成若干个小字段

2.2 内置正则表达式

内置正则格式:%{内置正则表达式:小字段名}

1.举个例子,用内置正则匹配消息记录

192.168.80.10 GET /index.html 15824 0.043

%{IP:client_id_address} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:http_response_time}
登录kibana,进入Grok Debugger界面

在这里插入图片描述

2.官方提供的常量

Logstash 官方也给了一些常用的常量来表达那些正则表达式.

地址:https://github.com/logstash-plugins/logstash-patterns-core/blob/main/patterns/ecs-v1/grok-patterns

USERNAME [a-zA-Z0-9._-]+
USER %{USERNAME}
EMAILLOCALPART [a-zA-Z][a-zA-Z0-9_.+-=:]+
EMAILADDRESS %{EMAILLOCALPART}@%{HOSTNAME}
INT (?:[+-]?(?:[0-9]+))
BASE10NUM (?<![0-9.+-])(?>[+-]?(?:(?:[0-9]+(?:\.[0-9]+)?)|(?:\.[0-9]+)))
NUMBER (?:%{BASE10NUM})
BASE16NUM (?<![0-9A-Fa-f])(?:[+-]?(?:0x)?(?:[0-9A-Fa-f]+))
BASE16FLOAT \b(?<![0-9A-Fa-f.])(?:[+-]?(?:0x)?(?:(?:[0-9A-Fa-f]+(?:\.[0-9A-Fa-f]*)?)|(?:\.[0-9A-Fa-f]+)))\b

POSINT \b(?:[1-9][0-9]*)\b
NONNEGINT \b(?:[0-9]+)\b
WORD \b\w+\b
NOTSPACE \S+
SPACE \s*
DATA .*?
GREEDYDATA .*
QUOTEDSTRING (?>(?<!\\)(?>"(?>\\.|[^\\"]+)+"|""|(?>'(?>\\.|[^\\']+)+')|''|(?>(?>\\.|[^\\]+)+)|))
UUID [A-Fa-f0-9]{8}-(?:[A-Fa-f0-9]{4}-){3}[A-Fa-f0-9]{12}
# URN, allowing use of RFC 2141 section 2.3 reserved characters
URN urn:[0-9A-Za-z][0-9A-Za-z-]{0,31}:(?:%[0-9a-fA-F]{2}|[0-9A-Za-z()+,.:=@;$_!*'/?#-])+

# Networking
MAC (?:%{CISCOMAC}|%{WINDOWSMAC}|%{COMMONMAC})
CISCOMAC (?:(?:[A-Fa-f0-9]{4}\.){2}[A-Fa-f0-9]{4})
WINDOWSMAC (?:(?:[A-Fa-f0-9]{2}-){5}[A-Fa-f0-9]{2})
COMMONMAC (?:(?:[A-Fa-f0-9]{2}:){5}[A-Fa-f0-9]{2})
IPV6 ((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?
IPV4 (?<![0-9])(?:(?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5]))(?![0-9])
IP (?:%{IPV6}|%{IPV4})
HOSTNAME \b(?:[0-9A-Za-z][0-9A-Za-z-]{0,62})(?:\.(?:[0-9A-Za-z][0-9A-Za-z-]{0,62}))*(\.?|\b)
IPORHOST (?:%{IP}|%{HOSTNAME})
HOSTPORT %{IPORHOST}:%{POSINT}

# paths
PATH (?:%{UNIXPATH}|%{WINPATH})
UNIXPATH (/([\w_%!$@:.,+~-]+|\\.)*)+
TTY (?:/dev/(pts|tty([pq])?)(\w+)?/?(?:[0-9]+))
WINPATH (?>[A-Za-z]+:|\\)(?:\\[^\\?*]*)+
URIPROTO [A-Za-z]([A-Za-z0-9+\-.]+)+
URIHOST %{IPORHOST}(?::%{POSINT:port})?
# uripath comes loosely from RFC1738, but mostly from what Firefox
# doesn't turn into %XX
URIPATH (?:/[A-Za-z0-9$.+!*'(){},~:;=@#%&_\-]*)+
#URIPARAM \?(?:[A-Za-z0-9]+(?:=(?:[^&]*))?(?:&(?:[A-Za-z0-9]+(?:=(?:[^&]*))?)?)*)?
URIPARAM \?[A-Za-z0-9$.+!*'|(){},~@#%&/=:;_?\-\[\]<>]*
URIPATHPARAM %{URIPATH}(?:%{URIPARAM})?
URI %{URIPROTO}://(?:%{USER}(?::[^@]*)?@)?(?:%{URIHOST})?(?:%{URIPATHPARAM})?

# Months: January, Feb, 3, 03, 12, December
MONTH \b(?:[Jj]an(?:uary|uar)?|[Ff]eb(?:ruary|ruar)?|[Mm](?:a|ä)?r(?:ch|z)?|[Aa]pr(?:il)?|[Mm]a(?:y|i)?|[Jj]un(?:e|i)?|[Jj]ul(?:y)?|[Aa]ug(?:ust)?|[Ss]ep(?:tember)?|[Oo](?:c|k)?t(?:ober)?|[Nn]ov(?:ember)?|[Dd]e(?:c|z)(?:ember)?)\b
MONTHNUM (?:0?[1-9]|1[0-2])
MONTHNUM2 (?:0[1-9]|1[0-2])
MONTHDAY (?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9])

# Days: Monday, Tue, Thu, etc...
DAY (?:Mon(?:day)?|Tue(?:sday)?|Wed(?:nesday)?|Thu(?:rsday)?|Fri(?:day)?|Sat(?:urday)?|Sun(?:day)?)

# Years?
YEAR (?>\d\d){1,2}
HOUR (?:2[0123]|[01]?[0-9])
MINUTE (?:[0-5][0-9])
# '60' is a leap second in most time standards and thus is valid.
SECOND (?:(?:[0-5]?[0-9]|60)(?:[:.,][0-9]+)?)
TIME (?!<[0-9])%{HOUR}:%{MINUTE}(?::%{SECOND})(?![0-9])
# datestamp is YYYY/MM/DD-HH:MM:SS.UUUU (or something like it)
DATE_US %{MONTHNUM}[/-]%{MONTHDAY}[/-]%{YEAR}
DATE_EU %{MONTHDAY}[./-]%{MONTHNUM}[./-]%{YEAR}
ISO8601_TIMEZONE (?:Z|[+-]%{HOUR}(?::?%{MINUTE}))
ISO8601_SECOND (?:%{SECOND}|60)
TIMESTAMP_ISO8601 %{YEAR}-%{MONTHNUM}-%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?%{ISO8601_TIMEZONE}?
DATE %{DATE_US}|%{DATE_EU}
DATESTAMP %{DATE}[- ]%{TIME}
TZ (?:[APMCE][SD]T|UTC)
DATESTAMP_RFC822 %{DAY} %{MONTH} %{MONTHDAY} %{YEAR} %{TIME} %{TZ}
DATESTAMP_RFC2822 %{DAY}, %{MONTHDAY} %{MONTH} %{YEAR} %{TIME} %{ISO8601_TIMEZONE}
DATESTAMP_OTHER %{DAY} %{MONTH} %{MONTHDAY} %{TIME} %{TZ} %{YEAR}
DATESTAMP_EVENTLOG %{YEAR}%{MONTHNUM2}%{MONTHDAY}%{HOUR}%{MINUTE}%{SECOND}

# Syslog Dates: Month Day HH:MM:SS
SYSLOGTIMESTAMP %{MONTH} +%{MONTHDAY} %{TIME}
PROG [\x21-\x5a\x5c\x5e-\x7e]+
SYSLOGPROG %{PROG:program}(?:\[%{POSINT:pid}\])?
SYSLOGHOST %{IPORHOST}
SYSLOGFACILITY <%{NONNEGINT:facility}.%{NONNEGINT:priority}>
HTTPDATE %{MONTHDAY}/%{MONTH}/%{YEAR}:%{TIME} %{INT}

# Shortcuts
QS %{QUOTEDSTRING}

# Log formats
SYSLOGBASE %{SYSLOGTIMESTAMP:timestamp} (?:%{SYSLOGFACILITY} )?%{SYSLOGHOST:logsource} %{SYSLOGPROG}:

# Log Levels
LOGLEVEL ([Aa]lert|ALERT|[Tt]race|TRACE|[Dd]ebug|DEBUG|[Nn]otice|NOTICE|[Ii]nfo|INFO|[Ww]arn?(?:ing)?|WARN?(?:ING)?|[Ee]rr?(?:or)?|ERR?(?:OR)?|[Cc]rit?(?:ical)?|CRIT?(?:ICAL)?|[Ff]atal|FATAL|[Ss]evere|SEVERE|EMERG(?:ENCY)?|[Ee]merg(?:ency)?)

2.3 自定义正则表达式

自定义正则格式:(?<小字段名>自定义正则表达式)

#举个例子
#目标消息记录
192.168.80.11 - - [14/Oct/2023:11:53:02 +0800] "GET /jxl.html HTTP/1.1" 200 17 "-" "curl/7.29.0" "-"

#按照以下格式显示
  "remote_addr": 
  "response_code": 
  "http_method": 
  "refer_url": 
  "http_version": 
  "request_uri": 
  "user_agent": 
  "access_time": 


#使用的正则表达式
%{IP:remote_addr} - - \[(?<access_time>.+)\] \"%{WORD:http_method} %{URIPATHPARAM:request_uri} (?<http_version>.+)\" %{NUMBER:response_code} [0-9]+ \"(?<refer_url>.+)\" \"(?<user_agent>.+)\" .*

在这里插入图片描述

三、mutate 数据修改插件

3.1 mutate插件的作用

对Logstash收集的日志事件字段进行格式化处理。

3.2 常用的配置选项

配置选项功能
rename重命名字段名
add_field添加字段
remove_field删除字段
replace替换字段的值
gsub修改字段值的字符
convert修改字段值的数据类型

3.3 mutate插件应用实例

#将字段old_field重命名为new_field
filter {
    mutate {
	    #写法1,使用中括号括起来
        rename => ["old_field" => "new_field"]

        #写法2,使用大括号{}括起来
	    rename => { "old_field" => "new_field" }		
    }
}


#添加字段
filter {
    mutate {
        add_field => {
        	"f1" => "field1"
        	"f2" => "field2"
        }
    }
}


#将字段删除
filter {
    mutate {
        remove_field  =>  ["message", "@version", "tags"]
    }
}


#将filedName1字段数据类型转换成string类型,filedName2字段数据类型转换成float类型
filter {
    mutate {
        #写法1,使用中括号括起来
        convert  =>  ["filedName1", "string"]
		
        #写法2,使用大括号{}括起来
		convert => { "filedName2" => "float" }
    }
}


#将filedName字段中所有"/“字符替换为”_"
filter {
    mutate {
        gsub => ["filedName", "/" , "_"]
    }
}


#将filedName字段中所有",“字符后面添加空格
filter {
    mutate {
        gsub => ["filedName", "," , ", "]
    }
}


#将filedName字段以"|"为分割符拆分数据成为数组
filter {
    mutate {
        split => ["filedName", "|"]
    }
}


#合并 “filedName1” 和 “ filedName2” 两个字段
filter {
    merge  { "filedName2" => "filedName1" }
}


#用新值替换filedName字段的值
filter {
    mutate {
        replace => { "filedName" => "new_value" }
    }
}


#添加字段first,值为message数组的第一个元素的值
filter {
    mutate {
        split => ["message", "|"]
        add_field => {
            "first" => "%{[message][0]}"    
        } 
    }
}


#有条件的添加标签
filter {
    #在日志文件路径包含 access 的条件下添加标签内容
    if [path] =~ "access" {
        mutate {
            add_tag => ["Nginx Access Log"]
        }
    }
    
    #在日志文件路径是 /var/log/nginx/error.log 的条件下添加标签内容
    if [path] == "/var/log/nginx/error.log" {
        mutate {
            add_tag => ["Nginx Error Log"]
        }
    }
}


四、multiline 多行合并插件

4.1 multiline插件的作用

将多行日志内容合并成一整行

4.2 常用配置项

在这里插入图片描述

pattern:通过正则表达式匹配行内容。

在这里插入图片描述

negate

false:不取反,表示正则匹配的行做合并操作。

true:取反,表示正则不匹配的行做合并操作。
在这里插入图片描述

what

previous表示向上合并

next表示向下合并

4.3 multiline插件应用实例

Step1 安装multiline插件

方式一:在线安装

cd /usr/share/logstash

bin/logstash-plugin install logstash-filter-multiline

方式二:离线安装

先在有网的机器上在线安装插件,然后打包,拷贝到服务器,执行安装命令。

bin/logstash-plugin prepare-offline-pack --overwrite --output logstash-filter-multiline.zip logstash-filter-multiline

bin/logstash-plugin install file:///usr/share/logstash/logstash-filter-multiline.zip

Step2 使用multiline插件

第一步:每一条日志的第一行开头都是一个时间,可以用时间的正则表达式匹配到第一行

第二步:然后将后面每一行的日志与第一行合并

第三步:当遇到某一行的开头是可以匹配正则表达式的时间的,就停止第一条日志的合并,开始合并第二条日志;

第四步:重复第二步和第三步。

filter {
  multiline {
    pattern => "^\d{4}-\d{1,2}-\d{1,2}\s\d{1,2}:\d{1,2}:\d{1,2}.\d{3}"
    negate => true
    what => "previous"
  }
}

在这里插入图片描述

五、date 时间处理插件

5.1 date插件的作用

将Logstash收集的日志事件时间@timestamp日志实际的时间进行格式统一。

需要先配置grok插件模块获取日志时间的小字段

5.2 常用的配置项

在这里插入图片描述

match:用于配置具体的匹配内容规则

前半部分内容表示匹配实际日志当中的时间戳的名称,后半部分则用于匹配实际日志当中的时间戳格式

这个地方是整条配置的核心内容,如果此处规则匹配是无效的,则生成后的日志时间戳将会被input插件读取的时间替代。

如果时间格式匹配失败,会生成一个tags字段,字段值为 _dateparsefailure,需要重新检查上边的match配置解析是否正确。

在这里插入图片描述

target将匹配的时间戳存储到给定的目标字段中

如果未提供,则默认更新事件的@timestamp字段。
在这里插入图片描述

timezone:当需要配置的date里面没有时区信息,而且不是UTC时间,需要设置timezone参数。

5.3 date插件应用实例

#新建子配置文件,用于测试
vim  /etc/logstash/conf.d/test.conf

#在filter块中,启用date插件
filter {
    date {
        match => ["access_time", "dd/MMM/YYYY:HH:mm:ss Z", "UNIX", "yyyy-MM-dd HH:mm:ss", "dd-MMM-yyyy HH:mm:ss"]
                target => "@timestamp"
                timezone => "Asia/Shanghai"
    }

在这里插入图片描述

#运行配置文件
#还需要启动filebeat收集日志,这里不再赘述
logstash -f test.conf

然后登录到kibana,查看视图的变化

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1105889.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

哈希表(拉链法)代码模板

这里也是用数组模拟链表 //拉链法 //模拟散列表 在算法题中一般只有添加和查询不会有删除 //如果真的要删除也不是真正的删除而是打上一个标记 //mod的这个数最好取大于数据范围的第一个质数 #include<iostream> #include<cstring> using namespace std; const in…

“1688商品评论接口:打造完美电商口碑的秘密武器!“

1688商品评论接口是一种供卖家使用的接口&#xff0c;可以让卖家通过该接口维护商品的评论信息&#xff0c;包括评论内容、评分、评论时间等等。 通过使用该接口&#xff0c;卖家可以方便地管理商品的评论信息&#xff0c;包括查看、修改、删除评论等操作。同时&#xff0c;该…

屏幕截图软件Snagit 2023 mac中文特点介绍

Snagit 2023 mac是一款屏幕截图和视频录制软件&#xff0c;它可以帮助用户快速捕捉屏幕上的任何内容&#xff0c;并将其编辑、标注和共享。 Snagit 2023 软件特点 多种截图模式&#xff1a;支持全屏截图、窗口截图、区域截图、延时截图等多种截图模式&#xff0c;满足不同用户…

二蛋赠书五期:《Python数据挖掘:入门、进阶与实用案例分析》

前言 大家好&#xff01;我是二蛋&#xff0c;一个热爱技术、乐于分享的工程师。在过去的几年里&#xff0c;我一直通过各种渠道与大家分享技术知识和经验。我深知&#xff0c;每一位技术人员都对自己的技能提升和职业发展有着热切的期待。因此&#xff0c;我非常感激大家一直…

vue使用pdf-dist实现pdf预览以及水印

vue使用pdf-dist实现pdf预览以及水印 一.使用pdf-dist插件将PDF文件转换为一张张canvas图片 npm install pdf-dist二.页面引入插件 const pdfJS require("pdfjs-dist"); pdfJS.GlobalWorkerOptions.workerSrc require("pdfjs-dist/build/pdf.worker.entry&…

JavaScript中多种获取数组最后一个元素的策略。

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 &…

ESD监控系统-设备接地报警器的应用领域和说明

ESD监控系统是一种用于检测和监控静电放电&#xff08;ESD&#xff09;的设备&#xff0c;其中设备接地监控报警器是其重要组成部分之一。该设备主要用于检测设备的接地情况&#xff0c;当设备没有接地或者接地不良时&#xff0c;会发出报警信号&#xff0c;提醒操作人员及时采…

idea控制台乱码

如果打包时&#xff0c;控制台出现错误乱码的解决办法 而修改此后&#xff0c;运行程序有可能报错&#xff0c;则需要添加vm参数即可&#xff1a;

每日一题 2530. 执行 K 次操作后的最大分数(中等,最大根堆)

显然每次需要取出最大的元素&#xff0c;用过后将他除以三重新加入数组中&#xff0c;所以只要维护一个最大根堆即可 class Solution:def maxKelements(self, nums: List[int], k: int) -> int:nums [-i for i in nums]heapq.heapify(nums)ans 0for i in range(k):ans -…

Himmelblau函数-优化问题的经典案例

Himmelblau函数-优化问题的经典案例 前言 Himmelblau函数是一种常见的多元函数&#xff0c;它的形式为f(x,y)(x^2y-11)^2(xy^2-7)^2。这个函数的名字来源于其发明者David Himmelblau&#xff0c;它在数学和工程领域中都有广泛的应用。 一、Himmelblau函数是什么&#xff1f; …

Fast DDS介绍

目录 架构 Fast DDS是一个DCPS(data-centric)数据中心的发布-订阅模型中间件&#xff0c;主要关注应用程序中处理和发送数据。 架构 一个DomainParticipant启动的线程 NameTypeCardinalityDescriptionEventGeneral每个DomainParticipant一个处理周期性事件和触发的时间事件Dis…

Tomcat配置文件

Tomcat 是一个开源的 web 应用服务器 区别nginx NGINX主要处理静态页面 那么动态请求&#xff08;连接数据库 动态页面&#xff09; 并不是NGINXde 长项 动态的请求会交给tomcat 进行处理 Tomcat : 1 处理动态页面请求&#xff08;http的请求&#xff09; 2 处理后端…

vue集成钉钉单点登录

初始环境判断 判断是否是来自钉钉环境的访问&#xff0c;返回&#xff1a;boolean类型值 window.navigator.userAgent.includes("DingTalk")前端引入vue中钉钉相关的依赖&#xff0c;并获取钉钉的临时授权码 import * as dingtalk from dingtalk-jsapi; let that …

某翻译网站webpack 全扣js逆向法

持续创作文章&#xff0c;只是为了更好的思考 如下内容&#xff0c;如果有写的不清楚&#xff0c;不对的地方&#xff0c;也请大家提醒我一下&#xff0c;谢谢&#xff01; 本次的目标是某道翻译网站&#xff0c;相信各位爷应该明白&#xff0c;这次逆向的整体做法还是把webpac…

Element UI打开表单自动验证问题的解决

最近深陷Element表单验证的坑&#xff0c;被一个问题困扰了好几天&#xff1a;页面一打开什么都没做表单就自动验证。在排除页面未触发了validate方法的情况下&#xff0c;需要观察下rules值是否发生了变化&#xff0c;如果rules值发生了变化&#xff0c;需要在<el-form>…

单片机学习一定要先买开发板么?

今日话题&#xff0c;单片机学习一定要先买开发板么&#xff1f;不一定要先买&#xff0c;但如果想要深入学习&#xff0c;在对单片机有了一定的了解之后&#xff0c;还是建议买。如果是单纯为了入门学习单片机&#xff0c;完全可以用仿真软件。不过&#xff0c;如果想要用单片…

木与空间的舞蹈:奥地利住宅的独特设计

国外著名设计师&#xff0c;为一位业主设计了一座住宅&#xff0c;附带有附属建筑和有盖的入口&#xff0c;形成了像庭院一样的建筑群。 这座住宅采用了当地的传统建筑风格&#xff0c;有长方形的平面和陡峭的顶棚&#xff0c;与周围的房屋相符。然而&#xff0c;内部设计别具一…

【ChatGLM2-6B】在只有CPU的Linux服务器上进行部署

简介 ChatGLM2-6B 是清华大学开源的一款支持中英双语的对话语言模型。经过了 1.4T 中英标识符的预训练与人类偏好对齐训练&#xff0c;具有62 亿参数的 ChatGLM2-6B 已经能生成相当符合人类偏好的回答。结合模型量化技术&#xff0c;用户可以在消费级的显卡上进行本地部署&…

PhotoShop字体加粗,PhotoShop字体添加边框,PhotoShop设置文字背景为图片

字体加粗 创建文字&#xff1a; 选中文字 &#xff08;用鼠标点一下&#xff09; 然后 转换为智能对象 输入合适的数值即可加粗字体 字体添加外边框 点击字体&#xff0c;点击右下角的fx 咋fx中选择描边 设置文字背景为图片 将文字放到刚刚图片所在的位置即可 。…

useragent识别访问设备

背景需求 ruoyi框架&#xff0c;前后端分离。现在要在用户访问的时候根据不同的设备跳转到不同的登录页面。 教程 router/index.js 修改src/router/index.js&#xff0c;在这里增加自己的要跳转的页面 permission.js 在白名单中添加自己的登录页面 增加以下识别的代码 le…