Fluentd日志采集使用教程

fluentd是何方神圣

fluentd是一个实时的数据收集系统,不仅可以收集日志,还可以收集定期执行的命令输出和HTTP请求内容。数据被收集后按照用户配置的解析规则,形成一系列event。每一个event包含如下内容:

tag = xxx
time = xxx
record = {
    "key1": "value1",
    "key2": "value2"
}

其中:

  • tag:为数据流的标记。fluentd中可以具有多个数据源,解析器,过滤器和数据输出。他们之前使用tag来对应。类似于数据流按照tag分组。数据流向下游的时候只会进入tag相匹配的处理器。
  • time:event产生的时间,该字段通常由日志内的时间字段解析出来。
  • record:日志的内容,为JSON格式。

fluentd支持多种数据的解析过滤和输出操作。其中常用的有:

  • tail输入:增量读取日志文件作为数据源,支持日志滚动。
  • exec输入:定时执行命令,获取输出解析后作为数据源。
  • syslog输出:解析标准的syslog日志作为输入。
  • forward输入:接收其他fluentd转发来的数据作为数据源。
  • dummy:虚拟数据源,可以定时产生假数据,用于测试。
  • regexp解析器:使用正则表达式命名分组的方式提取出日志内容为JSON字段。
  • record_transformer过滤器:人为修改record内的字段。
  • file输出:用于将event落地为日志文件。
  • stdout:将event输出到stdout。如果fluentd以daemon方式运行,输出到fluentd的运行日志中。
  • forward:转发event到其他fluentd节点。
  • copy:多路输出,复制event到多个输出端。
  • kafka:输出event到Kafka。
  • webhdfs:输出event到HDFS。
  • elasticsearch:输出event到HDFS。

接下来以官网介绍为基础,穿插自己的理解,介绍下fluentd的使用方法。

安装启动方法

官网安装步骤链接:https://docs.fluentd.org/installation/install-by-rpm

下面是精简的在CentOS下的安装步骤。打开shell,执行如下命令:

curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent3.sh | sh

systemctl start td-agent

可以安装并启动fluentd。

配置文件位置

编辑fluentd配置文件的方法:

vim /etc/td-agent/td-agent.conf

修改运行用户和组

默认来说fluentd使用td-agent用户启动。如果需要修改fluentd的用户,需要执行:

vim /usr/lib/systemd/system/td-agent.service

文件内容如下所示:

[Unit]
Description=td-agent: Fluentd based data collector for Treasure Data
Documentation=https://docs.treasuredata.com/articles/td-agent
After=network-online.target
Wants=network-online.target

[Service]
User=td-agent
Group=td-agent
LimitNOFILE=65536
Environment=LD_PRELOAD=/opt/td-agent/embedded/lib/libjemalloc.so
Environment=GEM_HOME=/opt/td-agent/embedded/lib/ruby/gems/2.4.0/
Environment=GEM_PATH=/opt/td-agent/embedded/lib/ruby/gems/2.4.0/
Environment=FLUENT_CONF=/etc/td-agent/td-agent.conf
Environment=FLUENT_PLUGIN=/etc/td-agent/plugin
Environment=FLUENT_SOCKET=/var/run/td-agent/td-agent.sock
Environment=TD_AGENT_LOG_FILE=/var/log/td-agent/td-agent.log
Environment=TD_AGENT_OPTIONS=
EnvironmentFile=-/etc/sysconfig/td-agent
PIDFile=/var/run/td-agent/td-agent.pid
RuntimeDirectory=td-agent
Type=forking
ExecStart=/opt/td-agent/embedded/bin/fluentd --log $TD_AGENT_LOG_FILE --daemon /var/run/td-agent/td-agent.pid $TD_AGENT_OPTIONS
ExecStop=/bin/kill -TERM ${MAINPID}
ExecReload=/bin/kill -HUP ${MAINPID}
Restart=always
TimeoutStopSec=120

[Install]
WantedBy=multi-user.target

修改Service部分UserGroup配置项可以更改fluentd进程的用户和组。

检测配置文件是否正确的方法

在shell中运行:

/opt/td-agent/embedded/bin/fluentd -c /etc/td-agent/td-agent.conf

观察输出,如果有错误会给出对应提示。

数据流逻辑

fluentd以tag值为基准,决定数据的流经哪些处理器。

数据的流向为:source -> parser -> filter -> output

input配置

tail

增量读取日志文件。需要提供一个用于标记已经读取到位置的文件(position file)所在的路径。

tail针对日志滚动的支持:
tail方式采用跟踪文件inode的方式进行。比如日志名为app.log,如果日志发生滚动,被重命名为app.log.1。文件重命名的时候inode是不会改变的。因此发生滚动时写入到旧文件末尾的日志也可以被收集到。tail会跟踪旧文件的inode一段时间(rotate_wait配置),这段时间过去之后,tail不再监听app.log.1,开始监听新的app.log文件。

tail方式的示例配置:


  @type tail
  path /var/log/httpd-access.log
  pos_file /var/log/td-agent/httpd-access.log.pos
  tag apache.access
  
    @type apache2
  

注意:如果文件发生修改会输出全量文件内容。

配置项解释

tag:数据源的tag值。*号可以扩展为path(/替换为.)。例如

path /path/to/file
tag foo.*

tag会被扩展为foo.path.to.file

path:配置读取的路径。可以使用*或者是strftime。例如:

path /path/to/%Y/%m/%d/*

如果今天是2020年1月2日,fluentd会读取/path/to/2020/01/02目录下的内容。
也可以配置多个路径,使用逗号分隔:

path /path/to/a/*,/path/to/b/c.log

exclude_path:排除部分目录或文件,使用数组格式配置。

path /path/to/*
exclude_path ["/path/to/*.gz", "/path/to/*.zip"]

refresh_interval:多长时间刷新一次文件监听列表,配合*使用才有意义。

pos_file:位置文件地址。这个文件保存了监听的日志文件已经读取到第几行。该项一定要配置。
注意,不要再多个source之间共用pos file,否则会出现问题。
pos_file_compaction_interval:pos file文件压缩时间间隔。用于压缩pos file中不再监听的记录,不可解析的记录以及重复的记录。

parse标签:用于指定log的解析器(必须的配置项)。
例如:

# json

  @type json


# regexp

  @type regexp
  expression ^(?[^ ]*) (?[^ ]*) (?\d*)$

path_key:如果配置此项,监控文件的path会在event中,此项的key为path_key
例如:

path /path/to/access.log
path_key tailed_path

生成的数据如下所示:

{"tailed_path":"/path/to/access.log","k1":"v1",...,"kN":"vN"}

rotate_wait:日志发生滚动的时候,可能会有部分日志仍然输出在旧的日志文件,此时需要保持监听旧日志文件一段时间,这个时间配置就是rotate_wait

exec

周期性执行命令,抽取命令输出为event。

示例配置:


  @type exec
  command cmd arg arg
  
    keys k1,k2,k3
  
  
    tag_key k1
    time_key k2
    time_format %Y-%m-%d %H:%M:%S
  
  run_interval 10s

以上命令的含义为每10秒钟执行cmd arg arg命令,提取命令执行结果,以空白字符分隔三个字段的值为k1,k2,k3。其中k1的值作为tag,k2作为时间字段,使用%Y-%m-%d %H:%M:%S格式。

一个例子,周期获取系统的平均负载。配置方法如下:


  @type exec
  tag system.loadavg
  command cat /proc/loadavg | cut -d ' ' -f 1,2,3
  run_interval 1m
  
    @type tsv
    keys avg1,avg5,avg15
    delimiter " "
  

输出的日志格式为:

2018-06-29 17:27:35.115878527 +0900 system.loadavg: {"avg1":"0.30","avg5":"0.20","avg15":"0.05"}

syslog

连接rsyslog。可以作为rsyslog的接收端。

一个配置的例子:


  @type syslog
  port 5140
  bind 0.0.0.0
  tag system

fluentd打开5140端口监听rsyslog发来的log。

rsyslog配置文件/etc/rsyslog.conf设置为:

# Send log messages to Fluentd
*.* @127.0.0.1:5140

fluentd解析到的event格式如下:

tag = "#{@tag}.#{facility}.#{priority}"
time = 1353436518,
record = {
  "host": "host",
  "ident": "ident",
  "pid": "12345",
  "message": "text"
}

dummy

专用于测试的数据源。周期产生假数据。

配置举例:


  @type dummy
  dummy {"hello":"world"}

dummy常用参数:

  • tag: 标记值
  • size:每次发送的event数量
  • rate:每秒产生多少个event
  • auto_increment_key:自增键名。如果配置了此项,会有一个key为该配置项值的自增键
  • suspend:重启后自增值是否重新开始
  • dummy:测试数据内容

forward

用于接收其他fluentd forward过来的event。

示例配置:


  @type forward
  port 24224
  bind 0.0.0.0

output配置

file

输出event为文件。默认每天输出一个日志文件。

示例配置:


  @type file
  path /var/log/fluent/myapp
  compress gzip
  
    timekey 1d
    timekey_use_utc true
    timekey_wait 10m
  

包含的参数类型:

  • path:path支持placeholder,可以在日志路径中嵌入时间,tag和record中的字段值。例如:
path /path/to/${tag}/${key1}/file.%Y%m%d

  # buffer parameters

注意:buffer标签后面的内容为buffer chunk key。Buffer根据这些key分段。

  • append:flush的chuck是否追加到已存在的文件后。默认为false,便于文件的并行处理。
  • format标签,用来规定文件内容的格式,默认值为out_file。
  • inject标签,用来为event增加time和tag等字段。
  • add_path_suffix:是否增加path后缀
  • path_suffix:path后缀内容,默认为.log
  • compress:采用什么压缩格式,默认不压缩。
  • recompress:是否在buffer chunk已经压缩的情况再次压缩,默认为false。

forward

将event转发到其他的fluentd节点。如果配置了多个fluentd节点,会使用负载均衡和支持容错的方式发送。如果需要发送多份数据,需要使用copy。

配置示例:


  @type forward
  send_timeout 60s
  recover_wait 10s
  hard_timeout 60s

  
    name myserver1
    host 192.168.1.3
    port 24224
    weight 60
  
  
    name myserver2
    host 192.168.1.4
    port 24224
    weight 60
  
  ...

  
    @type file
    path /var/log/fluent/forward-failed
  

server标签内可以配置如下字段:

  • host
  • name
  • port
  • shared_key
  • username
  • password
  • standby 标记server为备用,只有其他node不可用的时候才会启用standby的node
  • weight 负载均衡的权重配置

copy

多路输出(复制event到多个输出端)

示例配置


  @type copy
  
    @type file
    path /var/log/fluent/myapp1
    ...
  
  
    ...
  
  
    ...
  

其中每一个store是一路输出。

重要参数:

  • copy_mode:复制模式。可选值有
    • no_copy:每路输出共享event。
    • shallow:浅拷贝,如果不修改嵌套字段可以使用。
    • deep:深拷贝,使用msgpack-ruby方式。
    • marshal:深拷贝,使用marshal方式。
  • store标签的ignore_error参数:如果被标记ignore_error的store出现错误,不会影响其他的store。官网的例子为:

  @type copy
  
    @type plugin1
  
  
    @type plugin2
  

假如plugin1出现错误,plugin2也不会执行。如果在plugin1的store添加上ignore_error参数,如下所示:


  @type copy
  
    @type plugin1
  
  
    @type plugin2
  

上述情况plugin2的运行不受影响。通常为不重要的store添加ignore_error参数。

http

通过http请求的方式发送event。
payload的格式由format标签决定。

示例配置:


  @type http

  endpoint http://logserver.com:9000/api
  open_timeout 2

  
    @type json
  
  
    flush_interval 10s
  

该例子使用http方式将event发送到http://logserver.com:9000/api,使用post方式,连接超时时间为2秒。输出格式为json,每10秒钟输出一次。

注意:

如果使用JSON的方式发送,HTTP请求的content-type为application/x-ndjson (newline-delimited JSONs)。如果用spring mvc接收会提示不支持。可以使用HTTPServletRequest接收request body。

stdout

标准输出的模式,如果使用后台模式运行fluentd,输出到fluentd的日志。多用于debug的时候。

配置方法:


  @type stdout

elasticsearch

输出event到elasticsearch。

示例配置:


  @type elasticsearch
  host localhost
  port 9200
  logstash_format true

可选参数:

  • host:单个elasticsearch节点地址
  • port:单个elasticsearch节点的端口号
  • hosts:elasticsearch集群地址。格式为ip1:port1,ip2:port2...
  • user和password:elasticsearch的认证信息
  • scheme:使用https还是http。默认为http模式
  • path:REST接口路径,默认为空
  • index_name:index名称
  • logstash_format:index是否使用logstash命名方式(logstash-%Y.%m.%d),默认不启用
  • logstash_prefix:logstash_format启用的时候,index命名前缀是什么。默认为logstash

kafka

把event输出到kafka。

示例配置如下:


  @type kafka2

  # list of seed brokers
  brokers :,:
  use_event_time true

  # buffer settings
  
    @type file
    path /var/log/td-agent/buffer/td
    flush_interval 3s
  

  # data type settings
  
    @type json
  

  # topic settings
  topic_key topic
  default_topic messages

  # producer settings
  required_acks -1
  compression_codec gzip

重要的参数为:

  • brokers:Kafka brokers的地址和端口号
  • topic_key:record中哪个key对应的值用作Kafka消息的key
  • default_topic:如果没有配置topic_key,默认使用的topic名字
  • format标签:确定发送的数据格式
  • use_event_time:是否使用fluentd event的时间作为Kafka消息的时间。默认为false。意思为使用当前时间作为发送消息的时间
  • required_acks:producer acks的值
  • compression_codec:压缩编码方式

webhdfs

event通过REST方式写入到HDFS。

HADOOP启用webhdfs的方法

core-site.xml


    
        fs.defaultFS
        hdfs://10.180.210.172:9000
    

hdfs-site.xml


    
        dfs.replication
        1
    
    
      dfs.http.address
      0.0.0.0:50070
    
    
    
      dfs.webhdfs.enabled
      true
    
    
      dfs.support.append
      true
    
    
      dfs.support.broken.append
      true
    

最后执行$HADOOP_HOME/sbin/httpfs.sh start命令启动webhdfs支持。

注意:此时webhdfs的端口号为50070。

示例配置和参数

示例配置:


  @type webhdfs
  host namenode.your.cluster.local
  port 50070
  path "/path/on/hdfs/access.log.%Y%m%d_%H.#{Socket.gethostname}.log"
  
    flush_interval 10s
  

注意:需要保证HDFS的目标目录具有写入权限。debug过程发现fluentd请求webhdfs没有使用user proxy,HDFS认为操作的用户为dr.who,无法创建文件。为了解决这个问题,设置HDFS目标目录的权限为777。

重要参数:

  • host:namenode的地址
  • port:namenode的端口号
  • path:写入文件路径。可以使用占位符或者ruby表达式。可以使用如下方式表示时间:
\%Y: year including the century (at least 4 digits)
\%m: month of the year (01..12)
\%d: Day of the month (01..31)
\%H: Hour of the day, 24-hour clock (00..23)
\%M: Minute of the hour (00..59)
\%S: Second of the minute (00..60)

输出参数:

  • timekey:多久输出一次文件到HDFS。如果path中没有配置占位符,默认为86400(1天)。如果指定了和时间相关的占位符,则文件输出周期自动和最小的时间占位符单位一致
  • timekey_wait:允许等待来迟日志的最长时间
  • flush_interval:flush间隔时间,默认为不设置
  • flush_at_shutdown:关闭的时候是否flush。如果使用内存类型的buffer,需要配置为true

parser配置

regexp

使用正则表达式命名分组的方式从日志(一行或多行)中提取信息。可以通过time_key指定event的time字段的名字。名字为time字段名的分组内容会被抽取为event时间。

一个在线测试正则表达式的工具:http://fluentular.herokuapp.com/

基本配置格式:


  @type regexp
  expression /.../

正则表达式可以添加额外的参数:
忽略大小写:/.../i
多行匹配:/.../m。注意,此时.匹配新行
同时使用忽略大小写和多行匹配:/.../im

一个例子,示例配置如下:


  @type regexp
  expression /^\[(?[^\]]*)\] (?[^ ]*) (?[^ ]*) (?<id>\d*)$/
  time_key logtime
  time_format %Y-%m-%d %H:%M:%S %z
  types id:integer
</parse>
</code></pre> 
 <p>如下的数据:</p> 
 <pre><code class="json">[2013-02-28 12:00:00 +0900] alice engineer 1
</code></pre> 
 <p>会被解析为:</p> 
 <pre><code>time:
1362020400 (2013-02-28 12:00:00 +0900)

record:
{
  "name" : "alice",
  "title": "engineer",
  "id"   : 1
}
</code></pre> 
 <h1>filter配置</h1> 
 <h2>record_transformer</h2> 
 <p>record_transformer用来修改event的结构,增加或修改字段。</p> 
 <p>一个record_transformer的例子:</p> 
 <pre><code class="xml"><filter foo.bar>
  @type record_transformer
  <record>
    hostname "#{Socket.gethostname}"
    tag ${tag}
  </record>
</filter>
</code></pre> 
 <p>这个filter匹配tag为<code>foo.bar</code>的source。event增加了两个新的字段:hostname和tag。</p> 
 <p>其中hostname这里使用了ruby表达式。tag使用了字符串插值。</p> 
 <p>如果数据为:</p> 
 <pre><code class="json">{"message":"hello world!"}
</code></pre> 
 <p>会被转换为:</p> 
 <pre><code class="json">{"message":"hello world!", "hostname":"db001.internal.example.com", "tag":"foo.bar"}
</code></pre> 
 <p>可以通过添加enable_ruby配置,在<code>${}</code>中使用ruby表达式。</p> 
 <p>例如:</p> 
 <pre><code class="xml"><filter foo.bar>
  @type record_transformer
  enable_ruby
  <record>
    avg ${record["total"] / record["count"]}
  </record>
</filter>
</code></pre> 
 <p>如下输入:</p> 
 <pre><code class="json">{"total":100, "count":10}
</code></pre> 
 <p>会被转换为:</p> 
 <pre><code class="json">{"total":100, "count":10, "avg":"10"}
</code></pre> 
 <p>注意,可以启用<code>auto_typecast true</code>配置实现自动类型转换。</p> 
 <p>修改字段的例子:</p> 
 <pre><code class="xml"><filter foo.bar>
  @type record_transformer
  <record>
    message yay, ${record["message"]}
  </record>
</filter>
</code></pre> 
 <p>如下输入:</p> 
 <pre><code class="json">{"message":"hello world!"}
</code></pre> 
 <p>会被修改为:</p> 
 <pre><code class="json">{"message":"yay, hello world!"}
</code></pre> 
 <p>可以在表达式中配置tag_parts变量,引用tag的第n部分。如下所示:</p> 
 <pre><code class="xml"><filter web.*>
  @type record_transformer
  <record>
    service_name ${tag_parts[1]}
  </record>
</filter>
</code></pre> 
 <p>如果遇到tag为<code>web.auth</code>的数据:</p> 
 <pre><code class="json">{"user_id":1, "status":"ok"}
</code></pre> 
 <p>会被转换为:</p> 
 <pre><code class="json">{"user_id":1, "status":"ok", "service_name":"auth"}
</code></pre> 
 <h3>record标签</h3> 
 <p>record标签的语法为:</p> 
 <pre><code class="xml"><record>
  NEW_FIELD NEW_VALUE
</record>
</code></pre> 
 <p>表达式中可以配置如下变量:</p> 
 <ul> 
  <li>record:获取record中某些字段的内容。例如<code>record["count"]</code> </li> 
  <li>tag:获取tag的内容</li> 
  <li>time:获取日志的时间戳</li> 
  <li>hostname:获取主机名字,和<code>#{Socket.gethostname}</code>作用一样</li> 
  <li>tag_parts[N]:tag以<code>.</code>分隔,获取tag的第N部分</li> 
  <li>tag_prefix[N]:获取tag的0-N部分</li> 
  <li>tag_suffix[N]:获取tag的N-结尾部分</li> 
 </ul> 
 <p>例如tag为<code>debug.my.app</code>,<code>tag_parts[1]</code>返回<code>my</code>。<code>tag_prefix</code>和<code>tag_suffix</code>的结果如下:</p> 
 <pre><code>tag_prefix[0] = debug          tag_suffix[0] = debug.my.app
tag_prefix[1] = debug.my       tag_suffix[1] = my.app
tag_prefix[2] = debug.my.app   tag_suffix[2] = app
</code></pre> 
 <h1>配置文件使用通配符和扩展</h1> 
 <p><code><match></code>和<code><filter></code>标签可以使用通配符和扩展。</p> 
 <p>tag以<code>.</code>为分隔符,分隔为多个部分。</p> 
 <p>fluentd支持的通配符和扩展有:<br> <code>*</code>:只匹配一个部分。比如<code>a.*</code>匹配<code>a.b</code>,但是不匹配<code>a</code>或<code>a.b.c</code>。<br> <code>**</code>:匹配0个或多个部分。比如<code>a.**</code>匹配<code>a</code>,<code>a.b</code>和<code>a.b.c</code>。<br> <code>{X,Y,Z}</code>:匹配X或Y或Z。<br> <code>#{expression}</code>:使用嵌入的ruby表达式。有一些快捷变量可以直接使用,例如<code>#{hostname}</code>和<code>#{worker_id}</code>。<br> <code>${..}</code>:使用变量值,tag,record<br> 可以使用如下的方式指定默认值。例如:<code>#{ENV["FOOBAR"] || use_default}</code>。如果FOOBAR环境变量不存在,则使用<code>use_default</code>这个值。</p> 
 <p>注意:match标签的匹配过程是有顺序的。比如说下面的例子:</p> 
 <pre><code><match **>
  @type blackhole_plugin
</match>

<match myapp.access>
  @type file
  path /var/log/fluent/access
</match>
</code></pre> 
 <p>因为上面的match总是能被匹配到,下面的match永远没有机会执行。</p> 
 <h1>Buffer</h1> 
 <p>buffer为fluentd很关键的配置,意为缓冲区。可以决定收集的数据存入什么介质,多长时间输出一次等。</p> 
 <p>buffer标签必须配置在match标签内(即在输出端配置)。</p> 
 <p>buffer具有一个@type属性,用来配置buffer的储存介质:</p> 
 <pre><code class="xml"><buffer>
  @type file
</buffer>
</code></pre> 
 <p>@type有两个值:</p> 
 <ul> 
  <li>file:存入文件</li> 
  <li>memory:存入内存,这个是默认值</li> 
 </ul> 
 <p>buffer标签后面可以跟随chunk keys,用来决定buffer以record的什么字段来分段存放。例如:</p> 
 <pre><code class="xml"><buffer ARGUMENT_CHUNK_KEYS>
  # ...
</buffer>
</code></pre> 
 <p>注意:</p> 
 <ol> 
  <li>可以指定多个buffer chunk keys,使用逗号分隔。</li> 
  <li>如果没有配置chunk key,所有的event都会写入同一个chunk file,直到buffer滚动。</li> 
 </ol> 
 <p>buffer如果使用time作为chunk key,可以按照时间对buffer进行分段。其中:</p> 
 <ul> 
  <li>timekey:时间的跨度</li> 
  <li>timekey_wait:flush延迟时间,用于等待迟到的数据</li> 
 </ul> 
 <p>官网的例子如下:</p> 
 <pre><code><match tag.**>
  # ...
  <buffer time>
    timekey      1h # chunks per hours ("3600" also available)
    timekey_wait 5m # 5mins delay for flush ("300" also available)
  </buffer>
</match>

# Time chunk key: events will be separated for hours (by timekey 3600)

11:59:30 web.access {"key1":"yay","key2":100}  ------> CHUNK_A

12:00:01 web.access {"key1":"foo","key2":200}  --|
                                                 |---> CHUNK_B
12:00:25 ssh.login  {"key1":"yay","key2":100}  --|
</code></pre> 
 <p>部分经常用到的配置参数:</p> 
 <ul> 
  <li>timekey_use_utc:使用国际标准时间还是当地时间,默认是使用当地时间。</li> 
  <li>timekey_zone:指定时区。</li> 
  <li>chunk_limit_size:chunk大小限制,默认8MB。</li> 
  <li>chunk_limit_records:chunk event条数限制。</li> 
  <li>total_limit_size:总buffer大小限制。</li> 
  <li>chunk_full_threshold:chunk大小超过chunk_limit_size * chunk_full_threshold时会自动flush。</li> 
  <li>queued_chunks_limit_size:限制队列中的chunk数目,防止频繁flush产生过多的chunk。</li> 
  <li>compress:压缩格式,可使用text或gzip。默认为text。</li> 
  <li>flush_at_shutdown:关闭时候是否flush。对于非持久化buffer默认值为true,持久化buffer默认值为false。</li> 
  <li>flush_interval:多长时间flush一次。</li> 
  <li>retry_timeout:重试flush的超时时间。在这个时间后不再会retry。</li> 
  <li>retry_forever:是否永远尝试flush。如果设置为true会忽略retry_timeout的配置。</li> 
  <li>retry_max_times:重试最大次数。</li> 
  <li>retry_type:有两个配置值:retry时间间隔,指数级增长或者是固定周期重试。</li> 
  <li>retry_wait:每次重试等待时间。</li> 
  <li>retry_exponential_backoff_base:retry时间指数扩大倍数。</li> 
  <li>retry_max_interval:最长retry时间间隔。</li> 
  <li>retry_randomize:是否随机retry时间间隔。</li> 
 </ul> 
 <h1>配置文件重用</h1> 
 <p>可以通过<code>@include 配置文件路径</code>方式,引用其他配置文件片段到fluentd主配置文件中。</p> 
 <p>配置文件路径可以使用绝对路径或相对路径。相对路径的基准路径为fluentd主配置文件所在的路径。</p> 
 <p><code>@include</code>可以出现在主配置文件的任何位置。</p> 
 <h1>Docker日志输出到fluentd</h1> 
 <p>通过配置fluentd logging driver的方式实现。<br> 该driver发送的log信息包含:</p> 
 <table> 
  <thead> 
   <tr> 
    <th>字段</th> 
    <th>描述</th> 
   </tr> 
  </thead> 
  <tbody> 
   <tr> 
    <td>container_id</td> 
    <td>64字符的container id</td> 
   </tr> 
   <tr> 
    <td>container_name</td> 
    <td>container名字</td> 
   </tr> 
   <tr> 
    <td>source</td> 
    <td>stdout或stderr</td> 
   </tr> 
   <tr> 
    <td>log</td> 
    <td>container的log</td> 
   </tr> 
  </tbody> 
 </table> 
 <h2>全局配置方式</h2> 
 <p>修改<code>/etc/docker/daemon.json</code>,增加如下内容:</p> 
 <pre><code class="json">{
  "log-driver": "fluentd",
  "log-opts": {
    "fluentd-address": "fluentdhost:24224"
  }
}
</code></pre> 
 <p>然后重启docker daemon使配置生效。</p> 
 <p>也可以通过添加<code>--log-driver</code>和<code>--log-opt</code>参数的方式指定某个container使用fluentd logging driver。如下所示:</p> 
 <pre><code class="shell">docker run --log-driver=fluentd --log-opt fluentd-address=fluentdhost:24224
</code></pre> 
 <p>可以通过在<code>--log-opt</code>后指定tag的方式,确定source的tag。</p> 
 <p>Docker官网参考链接:https://docs.docker.com/config/containers/logging/fluentd/</p> 
 <h1>配置实例</h1> 
 <h2>实例1</h2> 
 <p>采集<code>/root/my.txt</code>文件(内容格式为key value),并发送到<code>http://localhost:9090/</code>。</p> 
 <p>fluentd的配置文件如下:</p> 
 <pre><code class="xml"><source>
  @type tail
  path /root/my.txt
  pos_file /root/my.txt.pos
  tag my
  <parse>
    @type regexp
    expression /(?<key>\w+)\s(?<value>\w+)/
  </parse>
</source>

<match my>
  @type http

  endpoint http://localhost:9090/
  open_timeout 2
  http_method post

  <format>
    @type json
  </format>
  <buffer>
    flush_interval 3s
  </buffer>
</match>
</code></pre> 
 <h2>实例2</h2> 
 <p>提取用户操作记录,打印到fluentd日志。</p> 
 <pre><code class="xml"><source>
  @type tail
  # 这里使用HISTFILE环境变量,如果没有设置,使用默认值/root/.bash_history
  path "#{ENV["HISTFILE"] || /root/.bash_history}"
  pos_file /root/.bash_history.pos
  tag history
  <parse>
    @type none
  </parse>
</source>

<filter history>
  @type record_transformer
  <record>
    hostname ${hostname}
  </record>
</filter>

<match history>
  @type stdout
</match>
</code></pre> 
 <h2>实例3</h2> 
 <p>收集用户操作记录转发到另一个fluentd节点,同时将数据发送到Kafka和存入HDFS。</p> 
 <p>数据流为:fluentd采集端 -> fluentd收集端 -> kafka和HDFS</p> 
 <p>示例用户操作记录数据为:</p> 
 <pre><code class="xml">root pts/1 2020-03-26 10:59 (10.180.206.1):root 2020-03-26 11:00:09 130  tail -f /var/log/command.his.log
</code></pre> 
 <p>采集节点的配置:</p> 
 <pre><code class="xml"><source>
  @type tail
  path /var/log/command.his.log
  pos_file /var/log/command.his.log.pos
  tag history
  <parse>
    @type regexp
    # 使用正则解析日志文件
    expression /^(?<who_user>\w+)\s(?<pts>\S+)\s(?<who_time>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2})\s\((?<remote_ip>\d+\.\d+\.\d+\.\d+)\):(?<user>\w+)\s(?<time>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})\s(?<res>\d+)\s(?<command>.+)$/
    time_key time
  </parse>
</source>
<filter history>
  @type record_transformer
  <record>
    # event内容增加hostname这一行
    hostname ${hostname}
  </record>
</filter>

<match history>
  @type forward
  send_timeout 60s
  recover_wait 10s
  hard_timeout 60s
  <buffer>
    # 1秒钟向另一个fluentd节点转发一次
    flush_interval 1s
  </buffer>
  <server>
    name myserver1
    host 10.180.210.172
    port 24225
    weight 60
  </server>
</match>
</code></pre> 
 <p>fluentd收集节点的配置:</p> 
 <pre><code class="xml"><source>
  @type forward
  port 24225
  bind 0.0.0.0
  tag remote
</source>

<match remote>
  # 使用copy方式,分两路输出
  @type copy
  <store>
    @type kafka2

    brokers 10.180.210.172:9092
    use_event_time true

    <buffer topic>
        @type file
        path /var/log/td-agent/buffer/td
        flush_interval 3s
    </buffer>

    <format>
        @type json
    </format>

    default_topic history

    required_acks -1
  </store>
  <store>
    @type webhdfs
    host 10.180.210.172
    port 50070
    path "/history/access.log.%Y%m%d_%H.#{Socket.gethostname}.log"
    <buffer>
        flush_interval 60s
    </buffer>
  </store>
</match>
</code></pre> 
 <p>本文为原创内容,欢迎大家讨论、批评指正与转载。转载时请注明出处。</p> 
</article>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1709584061221122048"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                    <!-- 文章页-底部 动态广告位 -->
                    <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                </div>
                <div class="col-md-3">
                    <div class="row" id="ad">
                        <!-- 文章页-右侧1 动态广告位 -->
                        <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                        </div>
                        <!-- 文章页-右侧2 动态广告位 -->
                        <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                        </div>
                        <!-- 文章页-右侧3 动态广告位 -->
                        <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(Fluentd日志采集使用教程)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1881895035604103168.htm"
                           title="Moretl FileSync增量文件采集工具" target="_blank">Moretl FileSync增量文件采集工具</a>
                        <span class="text-muted">Moretl</span>
<a class="tag" taget="_blank" href="/search/MES/1.htm">MES</a><a class="tag" taget="_blank" href="/search/QMS/1.htm">QMS</a><a class="tag" taget="_blank" href="/search/SCADA/1.htm">SCADA</a><a class="tag" taget="_blank" href="/search/%E6%99%BA%E8%83%BD%E5%88%B6%E9%80%A0/1.htm">智能制造</a><a class="tag" taget="_blank" href="/search/IoT/1.htm">IoT</a>
                        <div>永久免费:我们希望MoretlFileSync是一款通用性很好的文件日志采集工具,解决工厂环境下,通过共享目录采集文件,SMB协议存在的安全性,兼容性的问题.同时,我们发现工厂设备日志一般为增量,为方便MES,QMS等后端系统直接使用数据,我们推出了增量采集功能.另外,我们具备从管理界面直接管理所有采集客户端,使整体运维工作更加高效简单.用途定时全量或增量采集工控机,电脑文件或日志.优势开箱即用:</div>
                    </li>
                    <li><a href="/article/1881834653912985600.htm"
                           title="multus使用教程" target="_blank">multus使用教程</a>
                        <span class="text-muted">RedCong</span>
<a class="tag" taget="_blank" href="/search/Openshift/1.htm">Openshift</a><a class="tag" taget="_blank" href="/search/k8s/1.htm">k8s</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a><a class="tag" taget="_blank" href="/search/openshift/1.htm">openshift</a><a class="tag" taget="_blank" href="/search/k8s/1.htm">k8s</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a>
                        <div>操作步骤如下:1.在vmwarevsphere上配置所有主机使用的端口组安全项Forgedtransmits设置为:AcceptPromiscuousMode设置为:AcceptPromiscuousMode(混杂模式)和ForgedTransmits(伪传输)2.给每台主机添加第二块网卡3.创建网络定义DHCP类型apiVersion:k8s.cni.cncf.io/v1kind:Network</div>
                    </li>
                    <li><a href="/article/1881828599867174912.htm"
                           title="RuoYi(若依)框架的介绍与基本使用(超详细分析)" target="_blank">RuoYi(若依)框架的介绍与基本使用(超详细分析)</a>
                        <span class="text-muted">涔溪</span>
<a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a><a class="tag" taget="_blank" href="/search/ruoyi/1.htm">ruoyi</a>
                        <div>**RuoYi(若依)**是一个基于SpringBoot和SpringCloud的企业级快速开发平台。它集成了多种常用的技术栈和中间件,旨在帮助企业快速构建稳定、高效的应用系统。以下是关于RuoYi框架的详细介绍和基本使用教程,涵盖了从环境搭建到核心功能的使用。RuoYi框架简介1.技术栈后端技术:SpringBoot,MyBatis,Druid,Redis,Shiro/SpringSecurit</div>
                    </li>
                    <li><a href="/article/1881707410700169216.htm"
                           title="Centos常用命令,按功能分类,用户和权限管理等" target="_blank">Centos常用命令,按功能分类,用户和权限管理等</a>
                        <span class="text-muted">ZHOUPUYU</span>
<a class="tag" taget="_blank" href="/search/%E8%B5%84%E6%96%99%E5%88%86%E4%BA%AB/1.htm">资料分享</a><a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>CentOS是一个基于RedHatEnterpriseLinux(RHEL)的免费开源操作系统,稳定可靠,广泛应用于服务器环境。以下是一份CentOS使用教程及常用命令的总结,帮助你快速上手。由于篇幅限制,这里只涵盖常用命令和基本操作,更深入的学习需要参考CentOS官方文档和相关书籍。一、安装CentOSCentOS的安装过程与其他Linux发行版类似,通常包含以下步骤:下载镜像:从CentOS</div>
                    </li>
                    <li><a href="/article/1881654423109824512.htm"
                           title="Python调用讯飞星火大模型v3.x api接口使用教程2.0(python sdk,支持图片理解)" target="_blank">Python调用讯飞星火大模型v3.x api接口使用教程2.0(python sdk,支持图片理解)</a>
                        <span class="text-muted">IT大头</span>
<a class="tag" taget="_blank" href="/search/NLP%E5%AE%9E%E6%88%98/1.htm">NLP实战</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B/1.htm">语言模型</a><a class="tag" taget="_blank" href="/search/nlp/1.htm">nlp</a><a class="tag" taget="_blank" href="/search/chatgpt/1.htm">chatgpt</a>
                        <div>前言本篇文章是针对星火大模型api接口使用的新篇章,本次主要是介绍对于pythonSDK使用,以及图片理解等新功能。相对于上篇博客中的使用方法,本次的教程相对来说更简单方便。话不多说,直接享用。1、获取api接口的ID和key参考上篇文章:https://blog.csdn.net/qq_45156060/article/details/134072123?spm=1001.2014.3001.5</div>
                    </li>
                    <li><a href="/article/1881646095168237568.htm"
                           title="Android 内核开发之—— repo 使用教程" target="_blank">Android 内核开发之—— repo 使用教程</a>
                        <span class="text-muted">ByteSaid</span>
<a class="tag" taget="_blank" href="/search/Android/1.htm">Android</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91/1.htm">开发</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/git/1.htm">git</a>
                        <div>前言repo是一个用于管理多个Git仓库的工具,特别适用于管理大型项目如Android的源码。它是由Google开发的,用于解决多个Git仓库的同步、管理和代码审查等问题。因此,做Android内核开发,首先要了解repo是什么,它是如何使用的?1repo的概念repo是一种代码版本管理工具,它是由一系列的Python脚本组成,封装了一系列的Git命令,用来统一管理多个Git仓库。2repo的作用</div>
                    </li>
                    <li><a href="/article/1881646092886536192.htm"
                           title="Android AIDL 使用教程" target="_blank">Android AIDL 使用教程</a>
                        <span class="text-muted">ByteSaid</span>
<a class="tag" taget="_blank" href="/search/Android/1.htm">Android</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91/1.htm">开发</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/ipc/1.htm">ipc</a><a class="tag" taget="_blank" href="/search/aidl/1.htm">aidl</a>
                        <div>AIDL(AndroidInterfaceDefinitionLanguage)是一种IDL语言,用于生成可以在Android设备上两个进程之间进行进程间通信(IPC)的代码。通过AIDL,可以在一个进程中获取另一个进程的数据和调用其暴露出来的方法,从而满足进程间通信的需求。通常,暴露方法给其他应用进行调用的应用称为服务端,调用其他应用的方法的应用称为客户端,客户端通过绑定服务端的Service来</div>
                    </li>
                    <li><a href="/article/1881437334407278592.htm"
                           title="OpenDRG/DRG_Datas 项目使用教程" target="_blank">OpenDRG/DRG_Datas 项目使用教程</a>
                        <span class="text-muted">咎宁准Karena</span>

                        <div>OpenDRG/DRG_Datas项目使用教程项目地址:https://gitcode.com/gh_mirrors/dr/DRG_Datas1.项目目录结构及介绍DRG_Datas/├──ICD/│├──ICD诊断、手术操作编码.csv│├──基础数据.csv│├──版本对照关系.csv│└──手术操作类别属性.csv├──Payment/│├──各地DRG病组清单.csv│└──医保支付标准.</div>
                    </li>
                    <li><a href="/article/1881082283344064512.htm"
                           title="Zoom视频会议软件详细使用教程" target="_blank">Zoom视频会议软件详细使用教程</a>
                        <span class="text-muted">范范0825</span>
<a class="tag" taget="_blank" href="/search/zoom/1.htm">zoom</a>
                        <div>Zoom是一款功能强大的视频会议软件,广泛用于远程工作、在线教育、虚拟会议等场景。本教程将详细介绍如何使用Zoom进行会议的创建、加入、管理以及各种高级功能的设置和应用。第一部分:准备工作和基本概述1.1下载和安装Zoom首先,你需要下载并安装Zoom客户端或移动应用程序。Zoom支持多种操作系统,包括Windows、MacOS、iOS和Android。访问Zoom官网(zoom.us)或者你的应</div>
                    </li>
                    <li><a href="/article/1881000378351284224.htm"
                           title="PyTorch使用教程- Tensor包" target="_blank">PyTorch使用教程- Tensor包</a>
                        <span class="text-muted">Loving_enjoy</span>
<a class="tag" taget="_blank" href="/search/%E8%AE%BA%E6%96%87/1.htm">论文</a><a class="tag" taget="_blank" href="/search/pytorch/1.htm">pytorch</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a>
                        <div>###PyTorch使用教程-Tensor包PyTorch是一个流行的深度学习框架,它提供了一个易于使用的API来创建和操作张量(Tensors)。张量是一个多维数组,类似于NumPy中的ndarray,但它是基于GPU的,支持自动求导。本文将详细介绍PyTorch中的Tensor包,包括张量的创建、运算、形状变换、索引与切片、以及重要的张量处理方式。####一、张量的创建在PyTorch中,可以</div>
                    </li>
                    <li><a href="/article/1880889375588413440.htm"
                           title="npm使用教程:从入门到精通" target="_blank">npm使用教程:从入门到精通</a>
                        <span class="text-muted">小周不想卷</span>
<a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AFnode.js%E5%85%A5%E9%97%A8/1.htm">前端node.js入门</a><a class="tag" taget="_blank" href="/search/npm/1.htm">npm</a>
                        <div>(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,还请三连支持一波哇ヾ(@^∇^@)ノ)目录引言第一部分:npm基础1.1安装Node.js与npm1.2npm的基本命令第二部分:npm进阶2.1使用package.json管理依赖2.2使用npm脚本2.3版本管理第三部分:npm的高级特性3.1npmScripts的生命周期3.2使用npmlink进行本地开发3.3使用n</div>
                    </li>
                    <li><a href="/article/1880876529743884288.htm"
                           title="C# delegate 委托使用教程" target="_blank">C# delegate 委托使用教程</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/c%23.net/1.htm">c#.net</a>
                        <div>什么是委托?委托是定义方法签名的引用类型数据类型,可以定义委托的变量,就像其他数据类型一样,可以引用与委托具有相同签名的任何方法。它允许方法作为参数传递,并允许事件驱动编程。它们提供了一种以类型安全的方式封装方法引用的方法。委托是一种类型,类似于C++的函数指针,但更安全和灵活。委托可以存储对方法的引用(或者多个方法)。委托是实现事件和回调的基础。为什么使用委托?类型安全:委托提供一种类型安全的方</div>
                    </li>
                    <li><a href="/article/1880875515225632768.htm"
                           title="Linux xargs 命令使用教程" target="_blank">Linux xargs 命令使用教程</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>简介xargs是一个功能强大的Linux命令,用于从标准输入构建和执行命令。它接受一个命令的输出,并将其作为参数提供给另一个命令。它在处理大量输入时特别有用,其含义可以解释为:extendedarguments,使用xargs允许echo、rm、mkdir等命令接受标准输入作为参数。与管道的对比管道仅将一个命令的输出传递到下一个命令的输入。xargs将输入(通常来自标准输出)转换为另一个命令的参数</div>
                    </li>
                    <li><a href="/article/1880858729205788672.htm"
                           title="开源 AI人脸替换工具离线版V7.0(最好的开源换脸ai,老电脑可运行)" target="_blank">开源 AI人脸替换工具离线版V7.0(最好的开源换脸ai,老电脑可运行)</a>
                        <span class="text-muted">struggle2025</span>
<a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a>
                        <div>这是热心网友万能君做的一个整合包,整合包里面已经包含了几个换脸项目和一些高清修复功能。(没有复杂的设置,安装简单,一键操作,适合老电脑)AI人脸替换工具离线版V7.0.zip下载地址夸克网盘分享使用教程夸克网盘分享要顺利使用这个工具,必须做好以下几点第一个这个工具只支持CPU+N卡。(如果没有N卡,用cpu也可以运行,就是稍微慢些,我的老电脑i74790+32g内存完美运行)如果需要使用N卡,一定</div>
                    </li>
                    <li><a href="/article/1880691079649488896.htm"
                           title="Fiddler抓包工具保姆级使用教程(超详细)" target="_blank">Fiddler抓包工具保姆级使用教程(超详细)</a>
                        <span class="text-muted">2401_89224765</span>
<a class="tag" taget="_blank" href="/search/fiddler/1.htm">fiddler</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7/1.htm">测试工具</a>
                        <div>Fiddler使用一.下载安装Fiddler二.设置抓取HTTPS功能三.尝试抓取HTTP/HTTPS协议四.抓包工具的原理一.下载安装Fiddler===========================================================================这里强烈建议大家在官网上下载安装,在此附上链接https://www.telerik.com/fid</div>
                    </li>
                    <li><a href="/article/1880502367804256256.htm"
                           title="IDLark 开源项目使用教程" target="_blank">IDLark 开源项目使用教程</a>
                        <span class="text-muted">缪阔孝Ruler</span>

                        <div>IDLark开源项目使用教程idlark项目地址:https://gitcode.com/gh_mirrors/id/idlark1.项目的目录结构及介绍IDLark项目的目录结构如下:idlark/├──LEGAL.md├──LICENSE├──README.md├──poetry.lock├──pyproject.toml└──idlark/└──__init__.py目录结构介绍LEGAL.</div>
                    </li>
                    <li><a href="/article/1880398081137111040.htm"
                           title="jira使用教程pdf_Encom modelvision pro 中文使用教程使用手册.pdf" target="_blank">jira使用教程pdf_Encom modelvision pro 中文使用教程使用手册.pdf</a>
                        <span class="text-muted">weixin_39774491</span>
<a class="tag" taget="_blank" href="/search/jira%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8Bpdf/1.htm">jira使用教程pdf</a>
                        <div>EnergyXT.v2.5.3-UNION\ESF.Database.Migration.Toolkit.Professional.Edition.v6.4.01.Incl.FarPoint.Spread.for.ASP.NET.v4.0.2023.for.DotNET.Framework.v2.0-BEAN\FarPoint.Spread.for.ASP.NET.v4.0.3523.for.Do</div>
                    </li>
                    <li><a href="/article/1880321047815843840.htm"
                           title="Keil5 的使用教程" target="_blank">Keil5 的使用教程</a>
                        <span class="text-muted">max500600</span>
<a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/1.htm">开发工具</a><a class="tag" taget="_blank" href="/search/%E4%B8%AA%E4%BA%BA%E5%BC%80%E5%8F%91/1.htm">个人开发</a>
                        <div>以下是Keil5的使用教程:一、安装与设置下载与安装:从Keil官方网站(https://www.keil.com/)下载KeilμVision5安装包。运行安装程序,按照提示逐步完成安装。注册与激活(如果需要):部分版本可能需要注册和激活才能使用全部功能。按照软件提示进行注册和激活操作。安装芯片支持包:Keil5需要安装相应的芯片支持包才能对特定的微控制器进行开发。可以在Keil的官方网站或软件</div>
                    </li>
                    <li><a href="/article/1880050613237116928.htm"
                           title="Typora保姆级使用教程!!!" target="_blank">Typora保姆级使用教程!!!</a>
                        <span class="text-muted">风茫</span>
<a class="tag" taget="_blank" href="/search/%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE/1.htm">环境配置</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E8%BE%91%E5%99%A8/1.htm">编辑器</a>
                        <div>文章目录markdown的使用说明一、标题这是二级标题二、段落1、换行2、分割线三、文字显示1、字体2、上下标四、列表1、无序列表2、有序列表3、任务列表五、区块显示六、代码显示1、行内代码2、代码块七、链接八、脚注九、图片插入十、表格十一、表情符号markdown的使用说明一、标题语法:#(一级标题)、##(二级标题)、###(三级标题)…代码:#这是一级标题##这是二级标题效果:这是二级标题快</div>
                    </li>
                    <li><a href="/article/1880042790243594240.htm"
                           title="IP归属地查询API快速定位用户位置" target="_blank">IP归属地查询API快速定位用户位置</a>
                        <span class="text-muted">海碗吃饭</span>
<a class="tag" taget="_blank" href="/search/IP%E5%BD%92%E5%B1%9E%E5%9C%B0%E6%9F%A5%E8%AF%A2API/1.htm">IP归属地查询API</a><a class="tag" taget="_blank" href="/search/api%E6%8E%A5%E5%8F%A3/1.htm">api接口</a>
                        <div>前言随着互联网的飞速发展,用户数据的准确性对于许多在线服务和应用来说变得至关重要。其中,用户的位置信息在很多场景下都是不可或缺的。无论是出于安全、个性化推荐,还是地理信息服务等需求,都需要能够快速、准确地定位用户位置。在这一背景下,IP归属地查询API成为了一个强大的工具,它能够帮助我们快速定位用户位置。IP归属地API的使用教程APISpace上提供多种类型的API接口,关于IP归属地API也分</div>
                    </li>
                    <li><a href="/article/1879872243102707712.htm"
                           title="RTDETR融合[WACV 2024]的MetaSeg中的gmb模块" target="_blank">RTDETR融合[WACV 2024]的MetaSeg中的gmb模块</a>
                        <span class="text-muted">今天炼丹了吗</span>
<a class="tag" taget="_blank" href="/search/RT-DETR%E6%B6%A8%E7%82%B9%E6%94%B9%E8%BF%9B%E4%B8%93%E6%A0%8F/1.htm">RT-DETR涨点改进专栏</a><a class="tag" taget="_blank" href="/search/RT-DETR/1.htm">RT-DETR</a>
                        <div>RT-DETR使用教程:RT-DETR使用教程RT-DETR改进汇总贴:RT-DETR更新汇总贴《MetaSeg:MetaFormer-basedGlobalContexts-awareNetworkforEfficientSemanticSegmentation》一、模块介绍论文链接:https://arxiv.org/abs/2408.07576代码链接:https://github.com/</div>
                    </li>
                    <li><a href="/article/1879820916439969792.htm"
                           title="Google Firebase ANE 使用教程" target="_blank">Google Firebase ANE 使用教程</a>
                        <span class="text-muted">lilili啊啊啊</span>
<a class="tag" taget="_blank" href="/search/%E7%A7%BB%E5%8A%A8%E5%BC%80%E5%8F%91/1.htm">移动开发</a><a class="tag" taget="_blank" href="/search/google/1.htm">google</a><a class="tag" taget="_blank" href="/search/firebase/1.htm">firebase</a><a class="tag" taget="_blank" href="/search/adobe/1.htm">adobe</a><a class="tag" taget="_blank" href="/search/air/1.htm">air</a><a class="tag" taget="_blank" href="/search/ane/1.htm">ane</a><a class="tag" taget="_blank" href="/search/admob/1.htm">admob</a><a class="tag" taget="_blank" href="/search/ane/1.htm">ane</a><a class="tag" taget="_blank" href="/search/google/1.htm">google</a><a class="tag" taget="_blank" href="/search/analysis/1.htm">analysis</a>
                        <div>GooleFirebaseANE使你可以轻松的在app里面集成google统计和admob到adobeair制作的游戏和应用中您可以使用它与AiriOS和AndroidApp使用相同的actionscript代码,不需要任何更改,不需要java或者ocFirebaseANE适用于AdobeAIR功能-[x]支持Firebase分析-[x]支持Admob准备firebase资源文件1.从[Fireb</div>
                    </li>
                    <li><a href="/article/1879818918873329664.htm"
                           title="Linux 下的模糊查找神器 fzf 使用教程" target="_blank">Linux 下的模糊查找神器 fzf 使用教程</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>简介fzf是一款功能强大且用途广泛的Linux命令行模糊查找器。它允许用户使用模糊匹配高效地搜索和过滤文本、文件和命令历史记录。它是一个交互式过滤程序,适用于任何类型的列表;文件、命令历史、进程、主机名、书签、git提交等。它实现了一种“模糊”匹配算法,因此可以快速键入带有省略字符的模式,并且仍然可以得到想要的结果。安装Debian/UbuntusudoaptinstallfzfRedHat/Ce</div>
                    </li>
                    <li><a href="/article/1835503712899002368.htm"
                           title="linux中sdl的使用教程,sdl使用入门" target="_blank">linux中sdl的使用教程,sdl使用入门</a>
                        <span class="text-muted">Melissa Corvinus</span>
<a class="tag" taget="_blank" href="/search/linux%E4%B8%ADsdl%E7%9A%84%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/1.htm">linux中sdl的使用教程</a>
                        <div>本文通过一个简单示例讲解SDL的基本使用流程。示例中展示一个窗口,窗口里面有个随机颜色快随机移动。当我们鼠标点击关闭按钮时间窗口关闭。基本步骤如下:1.初始化SDL并创建一个窗口。SDL_Init()初始化SDL_CreateWindow()创建窗口2.纹理渲染存储RGB和存储纹理的区别:比如一个从左到右由红色渐变到蓝色的矩形,用存储RGB的话就需要把矩形中每个点的具体颜色值存储下来;而纹理只是一</div>
                    </li>
                    <li><a href="/article/1835501948011376640.htm"
                           title="使用 FinalShell 进行远程连接(ssh 远程连接 Linux 服务器)" target="_blank">使用 FinalShell 进行远程连接(ssh 远程连接 Linux 服务器)</a>
                        <span class="text-muted">编程经验分享</span>
<a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/1.htm">开发工具</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/ssh/1.htm">ssh</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>目录前言基本使用教程新建远程连接连接主机自定义命令路由追踪前言后端开发,必然需要和服务器打交道,部署应用,排查问题,查看运行日志等等。一般服务器都是集中部署在机房中,也有一些直接是云服务器,总而言之,程序员不可能直接和服务器直接操作,一般都是通过ssh连接来登录服务器。刚接触远程连接时,使用的是XSHELL来远程连接服务器,连接上就能够操作远程服务器了,但是仅用XSHELL并没有上传下载文件的功能</div>
                    </li>
                    <li><a href="/article/1835485628268113920.htm"
                           title="福袋生活邀请码在哪里填写,福袋生活app邀请码使用教程" target="_blank">福袋生活邀请码在哪里填写,福袋生活app邀请码使用教程</a>
                        <span class="text-muted">小小编007</span>

                        <div>很多人下载福袋生活后,注册使用时需要填写邀请码。因为福袋生活是注册邀请制,所以首次使用填写邀请码才可以正常登录使用。福袋生活是广州市福袋生活信息科技有限公司旗下一家多元化社交电商导购平台,以APP为载体,社群为媒介,汇集衣食住行、吃喝玩乐生活服务板块,使用福袋生活可以领到淘宝,拼多多等电商平台的商品优惠券和返利,还可以兼职去分享赚钱。我为什么从福袋生活转到果冻宝盒呢?当然是因为福袋生活返利更高,注</div>
                    </li>
                    <li><a href="/article/1835337301350248448.htm"
                           title="Kubernetes Ingress 控制器(Nginx)安装与使用教程" target="_blank">Kubernetes Ingress 控制器(Nginx)安装与使用教程</a>
                        <span class="text-muted">农优影</span>

                        <div>KubernetesIngress控制器(Nginx)安装与使用教程kubernetes-ingressNGINXandNGINXPlusIngressControllersforKubernetes项目地址:https://gitcode.com/gh_mirrors/ku/kubernetes-ingress1.项目目录结构及介绍在nginxinc/kubernetes-ingress仓库中,</div>
                    </li>
                    <li><a href="/article/1835237156306644992.htm"
                           title="全自动解密解码神器 — Ciphey" target="_blank">全自动解密解码神器 — Ciphey</a>
                        <span class="text-muted">K'illCode</span>
<a class="tag" taget="_blank" href="/search/python_%E6%A8%A1%E5%9D%97/1.htm">python_模块</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/vscode/1.htm">vscode</a>
                        <div>Ciphey是一个使用自然语言处理和人工智能的全自动解密/解码/破解工具。简单地来讲,你只需要输入加密文本,它就能给你返回解密文本。就是这么牛逼。有了Ciphey,你根本不需要知道你的密文是哪种类型的加密,你只知道它是加密的,那么Ciphey就能在3秒甚至更短的时间内给你解密,返回你想要的大部分密文的答案。下面就给大家介绍Ciphey的实战使用教程。1.准备开始之前,你要确保Python和pip已</div>
                    </li>
                    <li><a href="/article/1835149125876805632.htm"
                           title="Zotero引文计数插件使用教程" target="_blank">Zotero引文计数插件使用教程</a>
                        <span class="text-muted">齐飞锴Timothea</span>

                        <div>Zotero引文计数插件使用教程zotero-citationcountsZoteropluginforauto-fetchingcitationcountsfromvarioussources项目地址:https://gitcode.com/gh_mirrors/zo/zotero-citationcounts项目介绍Zotero引文计数插件是由非盈利组织DigitalScholarshipCo</div>
                    </li>
                    <li><a href="/article/1835099706020163584.htm"
                           title="微信小程序常用开发框架有哪些?" target="_blank">微信小程序常用开发框架有哪些?</a>
                        <span class="text-muted">+码农快讯+</span>
<a class="tag" taget="_blank" href="/search/%E5%88%86%E4%BA%AB/1.htm">分享</a><a class="tag" taget="_blank" href="/search/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">微信小程序</a><a class="tag" taget="_blank" href="/search/%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%BC%80%E5%8F%91/1.htm">小程序开发</a>
                        <div>想要开发出一套高质量的小程序,运用框架,组件库是省时省力省心必不可少一部分,随着小程序日渐火爆,各种不同类型的小程序也渐渐更新,其中不乏一些优秀好用的框架/组件库。1:WeUI小程序–使用教程https://weui.io/官方介绍:WeUI是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信内网页和微信小程序量身设计,令用户的使用感知更加统一。小程序开发中最常用到的一款框架,受广大</div>
                    </li>
                                <li><a href="/article/36.htm"
                                       title="ASM系列四 利用Method 组件动态注入方法逻辑" target="_blank">ASM系列四 利用Method 组件动态注入方法逻辑</a>
                                    <span class="text-muted">lijingyao8206</span>
<a class="tag" taget="_blank" href="/search/%E5%AD%97%E8%8A%82%E7%A0%81%E6%8A%80%E6%9C%AF/1.htm">字节码技术</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/AOP/1.htm">AOP</a><a class="tag" taget="_blank" href="/search/%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86/1.htm">动态代理</a><a class="tag" taget="_blank" href="/search/ASM/1.htm">ASM</a>
                                    <div>        这篇继续结合例子来深入了解下Method组件动态变更方法字节码的实现。通过前面一篇,知道ClassVisitor 的visitMethod()方法可以返回一个MethodVisitor的实例。那么我们也基本可以知道,同ClassVisitor改变类成员一样,MethodVIsistor如果需要改变方法成员,注入逻辑,也可以</div>
                                </li>
                                <li><a href="/article/163.htm"
                                       title="java编程思想 --内部类" target="_blank">java编程思想 --内部类</a>
                                    <span class="text-muted">百合不是茶</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%86%85%E9%83%A8%E7%B1%BB/1.htm">内部类</a><a class="tag" taget="_blank" href="/search/%E5%8C%BF%E5%90%8D%E5%86%85%E9%83%A8%E7%B1%BB/1.htm">匿名内部类</a>
                                    <div>内部类;了解外部类 并能与之通信 内部类写出来的代码更加整洁与优雅 
  
1,内部类的创建  内部类是创建在类中的 
 
package com.wj.InsideClass;

/*
 * 内部类的创建
 */
public class CreateInsideClass {

	public CreateInsideClass(</div>
                                </li>
                                <li><a href="/article/290.htm"
                                       title="web.xml报错" target="_blank">web.xml报错</a>
                                    <span class="text-muted">crabdave</span>
<a class="tag" taget="_blank" href="/search/web.xml/1.htm">web.xml</a>
                                    <div>web.xml报错 
  
The content of element type "web-app" must match "(icon?,display- 
 name?,description?,distributable?,context-param*,filter*,filter-mapping*,listener*,servlet*,s</div>
                                </li>
                                <li><a href="/article/417.htm"
                                       title="泛型类的自定义" target="_blank">泛型类的自定义</a>
                                    <span class="text-muted">麦田的设计者</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/%E6%B3%9B%E5%9E%8B/1.htm">泛型</a>
                                    <div>   为什么要定义泛型类,当类中要操作的引用数据类型不确定的时候。 
采用泛型类,完成扩展。 
  例如有一个学生类 
    
Student{
  Student(){
   System.out.println("I'm a student.....");
  }
} 
 有一个老师类 
  
</div>
                                </li>
                                <li><a href="/article/544.htm"
                                       title="CSS清除浮动的4中方法" target="_blank">CSS清除浮动的4中方法</a>
                                    <span class="text-muted">IT独行者</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/UI/1.htm">UI</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a>
                                    <div>清除浮动这个问题,做前端的应该再熟悉不过了,咱是个新人,所以还是记个笔记,做个积累,努力学习向大神靠近。CSS清除浮动的方法网上一搜,大概有N多种,用过几种,说下个人感受。 
1、结尾处加空div标签 clear:both      1   2   3   4      
.div 
1 
{ 
background 
: 
#000080 
; 
border 
: 
1px   
s</div>
                                </li>
                                <li><a href="/article/671.htm"
                                       title="Cygwin使用windows的jdk 配置方法" target="_blank">Cygwin使用windows的jdk 配置方法</a>
                                    <span class="text-muted">_wy_</span>
<a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a><a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/cygwin/1.htm">cygwin</a>
                                    <div>1.[vim /etc/profile] 
   JAVA_HOME="/cgydrive/d/Java/jdk1.6.0_43"  (windows下jdk路径为D:\Java\jdk1.6.0_43) 
   PATH="$JAVA_HOME/bin:${PATH}" 
   CLAS</div>
                                </li>
                                <li><a href="/article/798.htm"
                                       title="linux下安装maven" target="_blank">linux下安装maven</a>
                                    <span class="text-muted">无量</span>
<a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E8%A3%85/1.htm">安装</a>
                                    <div>Linux下安装maven(转)  1.首先到Maven官网 
下载安装文件,目前最新版本为3.0.3,下载文件为 
apache-maven-3.0.3-bin.tar.gz,下载可以使用wget命令; 
 
2.进入下载文件夹,找到下载的文件,运行如下命令解压 
  tar -xvf  apache-maven-2.2.1-bin.tar.gz  
解压后的文件夹</div>
                                </li>
                                <li><a href="/article/925.htm"
                                       title="tomcat的https 配置,syslog-ng配置" target="_blank">tomcat的https 配置,syslog-ng配置</a>
                                    <span class="text-muted">aichenglong</span>
<a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/http%E8%B7%B3%E8%BD%AC%E5%88%B0https/1.htm">http跳转到https</a><a class="tag" taget="_blank" href="/search/syslong-ng%E9%85%8D%E7%BD%AE/1.htm">syslong-ng配置</a><a class="tag" taget="_blank" href="/search/syslog%E9%85%8D%E7%BD%AE/1.htm">syslog配置</a>
                                    <div>1) tomcat配置https,以及http自动跳转到https的配置 
    1)TOMCAT_HOME目录下生成密钥(keytool是jdk中的命令) 
     keytool -genkey -alias tomcat -keyalg RSA -keypass changeit -storepass changeit</div>
                                </li>
                                <li><a href="/article/1052.htm"
                                       title="关于领号活动总结" target="_blank">关于领号活动总结</a>
                                    <span class="text-muted">alafqq</span>
<a class="tag" taget="_blank" href="/search/%E6%B4%BB%E5%8A%A8/1.htm">活动</a>
                                    <div>关于某彩票活动的总结 
具体需求,每个用户进活动页面,领取一个号码,1000中的一个; 
活动要求 
1,随机性,一定要有随机性; 
2,最少中奖概率,如果注数为3200注,则最多中4注 
3,效率问题,(不能每个人来都产生一个随机数,这样效率不高); 
4,支持断电(仍然从下一个开始),重启服务;(存数据库有点大材小用,因此不能存放在数据库) 
 
解决方案 
1,事先产生随机数1000个,并打</div>
                                </li>
                                <li><a href="/article/1179.htm"
                                       title="java数据结构 冒泡排序的遍历与排序" target="_blank">java数据结构 冒泡排序的遍历与排序</a>
                                    <span class="text-muted">百合不是茶</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>java的冒泡排序是一种简单的排序规则 
  
冒泡排序的原理:  
         比较两个相邻的数,首先将最大的排在第一个,第二次比较第二个 ,此后一样; 
        针对所有的元素重复以上的步骤,除了最后一个 
  
  
例题;将int array[] </div>
                                </li>
                                <li><a href="/article/1306.htm"
                                       title="JS检查输入框输入的是否是数字的一种校验方法" target="_blank">JS检查输入框输入的是否是数字的一种校验方法</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/js/1.htm">js</a>
                                    <div>如下是JS检查输入框输入的是否是数字的一种校验方法: 
<form method=post target="_blank">
   数字:<input type="text" name=num onkeypress="checkNum(this.form)"><br>
</form>
</div>
                                </li>
                                <li><a href="/article/1433.htm"
                                       title="Test注解的两个属性:expected和timeout" target="_blank">Test注解的两个属性:expected和timeout</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/JUnit/1.htm">JUnit</a><a class="tag" taget="_blank" href="/search/expected/1.htm">expected</a><a class="tag" taget="_blank" href="/search/timeout/1.htm">timeout</a>
                                    <div>JUnit4:Test文档中的解释: 
  The Test annotation supports two optional parameters. 
  The first, expected, declares that a test method should throw an exception. 
  If it doesn't throw an exception or if it </div>
                                </li>
                                <li><a href="/article/1560.htm"
                                       title="[Gson二]继承关系的POJO的反序列化" target="_blank">[Gson二]继承关系的POJO的反序列化</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/POJO/1.htm">POJO</a>
                                    <div>父类 
  
  
package inheritance.test2;

import java.util.Map;

public class Model {
    private String field1;
    private String field2;

    private Map<String, String> infoMap</div>
                                </li>
                                <li><a href="/article/1687.htm"
                                       title="【Spark八十四】Spark零碎知识点记录" target="_blank">【Spark八十四】Spark零碎知识点记录</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/spark/1.htm">spark</a>
                                    <div>1. ShuffleMapTask的shuffle数据在什么地方记录到MapOutputTracker中的 
ShuffleMapTask的runTask方法负责写数据到shuffle map文件中。当任务执行完成成功,DAGScheduler会收到通知,在DAGScheduler的handleTaskCompletion方法中完成记录到MapOutputTracker中 
  
   </div>
                                </li>
                                <li><a href="/article/1814.htm"
                                       title="WAS各种脚本作用大全" target="_blank">WAS各种脚本作用大全</a>
                                    <span class="text-muted">ronin47</span>
<a class="tag" taget="_blank" href="/search/WAS+%E8%84%9A%E6%9C%AC/1.htm">WAS 脚本</a>
                                    <div>   http://www.ibm.com/developerworks/cn/websphere/library/samples/SampleScripts.html 
   无意中,在WAS官网上发现的各种脚本作用,感觉很有作用,先与各位分享一下 
    
获取下载 
这些示例 jacl 和 Jython 脚本可用于在 WebSphere Application Server 的不同版本中自</div>
                                </li>
                                <li><a href="/article/1941.htm"
                                       title="java-12.求 1+2+3+..n不能使用乘除法、 for 、 while 、 if 、 else 、 switch 、 case 等关键字以及条件判断语句" target="_blank">java-12.求 1+2+3+..n不能使用乘除法、 for 、 while 、 if 、 else 、 switch 、 case 等关键字以及条件判断语句</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/switch/1.htm">switch</a>
                                    <div>借鉴网上的思路,用java实现: 
 




public class NoIfWhile {

	/**
	 * @param args
	 * 
	 * find x=1+2+3+....n
	 */
	public static void main(String[] args) {
		int n=10;
		int re=find(n);
		System.o</div>
                                </li>
                                <li><a href="/article/2068.htm"
                                       title="Netty源码学习-ObjectEncoder和ObjectDecoder" target="_blank">Netty源码学习-ObjectEncoder和ObjectDecoder</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/netty/1.htm">netty</a>
                                    <div>Netty中传递对象的思路很直观: 
Netty中数据的传递是基于ChannelBuffer(也就是byte[]); 
那把对象序列化为字节流,就可以在Netty中传递对象了 
相应的从ChannelBuffer恢复对象,就是反序列化的过程 
 
Netty已经封装好ObjectEncoder和ObjectDecoder 
 
先看ObjectEncoder 
ObjectEncoder是往外发送</div>
                                </li>
                                <li><a href="/article/2195.htm"
                                       title="spring 定时任务中cronExpression表达式含义" target="_blank">spring 定时任务中cronExpression表达式含义</a>
                                    <span class="text-muted">chicony</span>
<a class="tag" taget="_blank" href="/search/cronExpression/1.htm">cronExpression</a>
                                    <div>一个cron表达式有6个必选的元素和一个可选的元素,各个元素之间是以空格分隔的,从左至右,这些元素的含义如下表所示: 
代表含义            是否必须 允许的取值范围         &nb</div>
                                </li>
                                <li><a href="/article/2322.htm"
                                       title="Nutz配置Jndi" target="_blank">Nutz配置Jndi</a>
                                    <span class="text-muted">ctrain</span>
<a class="tag" taget="_blank" href="/search/JNDI/1.htm">JNDI</a>
                                    <div>1、使用JNDI获取指定资源: 
 

var ioc = {
    dao : {
        type :"org.nutz.dao.impl.NutDao",
        args : [ {jndi :"jdbc/dataSource"} ]
    }
}
 
以上方法,仅需要在容器中配置好数据源,注入到NutDao即可. </div>
                                </li>
                                <li><a href="/article/2449.htm"
                                       title="解决 /bin/sh^M: bad interpreter: No such file or directory" target="_blank">解决 /bin/sh^M: bad interpreter: No such file or directory</a>
                                    <span class="text-muted">daizj</span>
<a class="tag" taget="_blank" href="/search/shell/1.htm">shell</a>
                                    <div>在Linux中执行.sh脚本,异常/bin/sh^M: bad interpreter: No such file or directory。 
  
分析:这是不同系统编码格式引起的:在windows系统中编辑的.sh文件可能有不可见字符,所以在Linux系统下执行会报以上异常信息。 
解决: 
1)在windows下转换: 
利用一些编辑器如UltraEdit或EditPlus等工具</div>
                                </li>
                                <li><a href="/article/2576.htm"
                                       title="[转]for 循环为何可恨?" target="_blank">[转]for 循环为何可恨?</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/%E8%AF%BB%E4%B9%A6/1.htm">读书</a>
                                    <div>  
Java的闭包(Closure)特征最近成为了一个热门话题。 一些精英正在起草一份议案,要在Java将来的版本中加入闭包特征。 然而,提议中的闭包语法以及语言上的这种扩充受到了众多Java程序员的猛烈抨击。 
不久前,出版过数十本编程书籍的大作家Elliotte Rusty Harold发表了对Java中闭包的价值的质疑。 尤其是他问道“for 循环为何可恨?”[http://ju</div>
                                </li>
                                <li><a href="/article/2703.htm"
                                       title="Android实用小技巧" target="_blank">Android实用小技巧</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/android/1.htm">android</a>
                                    <div>1、去掉所有Activity界面的标题栏 
  修改AndroidManifest.xml   在application 标签中添加android:theme="@android:style/Theme.NoTitleBar" 
  
2、去掉所有Activity界面的TitleBar 和StatusBar  
  修改AndroidManifes</div>
                                </li>
                                <li><a href="/article/2830.htm"
                                       title="Oracle 复习笔记之序列" target="_blank">Oracle 复习笔记之序列</a>
                                    <span class="text-muted">eksliang</span>
<a class="tag" taget="_blank" href="/search/Oracle+%E5%BA%8F%E5%88%97/1.htm">Oracle 序列</a><a class="tag" taget="_blank" href="/search/sequence/1.htm">sequence</a><a class="tag" taget="_blank" href="/search/Oracle+sequence/1.htm">Oracle sequence</a>
                                    <div>转载请出自出处:http://eksliang.iteye.com/blog/2098859 
1.序列的作用 
 
 序列是用于生成唯一、连续序号的对象 
 一般用序列来充当数据库表的主键值 
 
2.创建序列语法如下: 
  
create sequence s_emp
start with 1      --开始值
increment by 1    --増长值
maxval</div>
                                </li>
                                <li><a href="/article/2957.htm"
                                       title="有“品”的程序员" target="_blank">有“品”的程序员</a>
                                    <span class="text-muted">gongmeitao</span>
<a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a>
                                    <div>完美程序员的10种品质   
  
 完美程序员的每种品质都有一个范围,这个范围取决于具体的问题和背景。没有能解决所有问题的 
  
完美程序员(至少在我们这个星球上),并且对于特定问题,完美程序员应该具有以下品质: 
  1. 才智非凡- 能够理解问题、能够用清晰可读的代码翻译并表达想法、善于分析并且逻辑思维能力强 
  
(范围:用简单方式解决复杂问题)   
 </div>
                                </li>
                                <li><a href="/article/3084.htm"
                                       title="使用KeleyiSQLHelper类进行分页查询" target="_blank">使用KeleyiSQLHelper类进行分页查询</a>
                                    <span class="text-muted">hvt</span>
<a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/.net/1.htm">.net</a><a class="tag" taget="_blank" href="/search/C%23/1.htm">C#</a><a class="tag" taget="_blank" href="/search/asp.net/1.htm">asp.net</a><a class="tag" taget="_blank" href="/search/hovertree/1.htm">hovertree</a>
                                    <div>本文适用于sql server单主键表或者视图进行分页查询,支持多字段排序。KeleyiSQLHelper类的最新代码请到http://hovertree.codeplex.com/SourceControl/latest下载整个解决方案源代码查看。或者直接在线查看类的代码:http://hovertree.codeplex.com/SourceControl/latest#HoverTree.D</div>
                                </li>
                                <li><a href="/article/3211.htm"
                                       title="SVG 教程 (三)圆形,椭圆,直线" target="_blank">SVG 教程 (三)圆形,椭圆,直线</a>
                                    <span class="text-muted">天梯梦</span>
<a class="tag" taget="_blank" href="/search/svg/1.htm">svg</a>
                                    <div>SVG <circle>   SVG 圆形 - <circle> 
<circle> 标签可用来创建一个圆: 
下面是SVG代码: 
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  <circle cx="100" c</div>
                                </li>
                                <li><a href="/article/3338.htm"
                                       title="链表栈" target="_blank">链表栈</a>
                                    <span class="text-muted">luyulong</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a>
                                    <div>
public class Node {
	private Object object;
	private Node next;

	public Node() {
		this.next = null;
		this.object = null;
	}

	public Object getObject() {
		return object;
	}

	public</div>
                                </li>
                                <li><a href="/article/3465.htm"
                                       title="基础数据结构和算法十:2-3 search tree" target="_blank">基础数据结构和算法十:2-3 search tree</a>
                                    <span class="text-muted">sunwinner</span>
<a class="tag" taget="_blank" href="/search/Algorithm/1.htm">Algorithm</a><a class="tag" taget="_blank" href="/search/2-3+search+tree/1.htm">2-3 search tree</a>
                                    <div>  
Binary search tree works well for a wide variety of applications, but they have poor worst-case performance. Now we introduce a type of binary search tree where costs are guaranteed to be loga</div>
                                </li>
                                <li><a href="/article/3592.htm"
                                       title="spring配置定时任务" target="_blank">spring配置定时任务</a>
                                    <span class="text-muted">stunizhengjia</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/timer/1.htm">timer</a>
                                    <div>最近因工作的需要,用到了spring的定时任务的功能,觉得spring还是很智能化的,只需要配置一下配置文件就可以了,在此记录一下,以便以后用到: 
  
  
//------------------------定时任务调用的方法------------------------------
    /**
     * 存储过程定时器
    */
    publi</div>
                                </li>
                                <li><a href="/article/3719.htm"
                                       title="ITeye 8月技术图书有奖试读获奖名单公布" target="_blank">ITeye 8月技术图书有奖试读获奖名单公布</a>
                                    <span class="text-muted">ITeye管理员</span>
<a class="tag" taget="_blank" href="/search/%E6%B4%BB%E5%8A%A8/1.htm">活动</a>
                                    <div>ITeye携手博文视点举办的8月技术图书有奖试读活动已圆满结束,非常感谢广大用户对本次活动的关注与参与。 
 
 
8月试读活动回顾: 
http://webmaster.iteye.com/blog/2102830 
 
 
本次技术图书试读活动的优秀奖获奖名单及相应作品如下(优秀文章有很多,但名额有限,没获奖并不代表不优秀): 
 
 
《跨终端Web》 
 
 
 
 gleams:http</div>
                                </li>
                </ul>
            </div>
        </div>
    </div>

<div>
    <div class="container">
        <div class="indexes">
            <strong>按字母分类:</strong>
            <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
        </div>
    </div>
</div>
<footer id="footer" class="mb30 mt30">
    <div class="container">
        <div class="footBglm">
            <a target="_blank" href="/">首页</a> -
            <a target="_blank" href="/custom/about.htm">关于我们</a> -
            <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
            <a target="_blank" href="/sitemap.txt">Sitemap</a> -
            <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
        </div>
        <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.
<!--            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>-->
        </div>
    </div>
</footer>
<!-- 代码高亮 -->
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>





</body>

</html>