-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatom.xml
More file actions
392 lines (332 loc) · 53 KB
/
Copy pathatom.xml
File metadata and controls
392 lines (332 loc) · 53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Mr.Kong</title>
<subtitle>做有积累的事情</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="http://yoursite.com/"/>
<updated>2017-06-13T15:46:40.000Z</updated>
<id>http://yoursite.com/</id>
<author>
<name>Mr.Kong</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>使用JavaMail发送邮件</title>
<link href="http://yoursite.com/2017/06/13/JavaMailSender/"/>
<id>http://yoursite.com/2017/06/13/JavaMailSender/</id>
<published>2017-06-13T15:28:04.000Z</published>
<updated>2017-06-13T15:46:40.000Z</updated>
<content type="html"><![CDATA[<h2 id="通过JavaMail发送邮件"><a href="#通过JavaMail发送邮件" class="headerlink" title="通过JavaMail发送邮件"></a>通过JavaMail发送邮件</h2><blockquote>
<p>最近遇到了一个需要发送邮件的需求,所以了解了一下Java发送邮件的方法。参考网上资料,跑了一个小Demo,特此记录一下。</p>
<p>此Demo可以实现最基本的发邮件功能,还有一些高级功能需要去摸索,比如支持html or markdown,比如添加附件。</p>
</blockquote>
<h5 id="1-申请一个163邮箱账号,kong-163-com"><a href="#1-申请一个163邮箱账号,kong-163-com" class="headerlink" title="1. 申请一个163邮箱账号,kong@163.com"></a>1. 申请一个163邮箱账号,kong@163.com</h5><h5 id="2-打开邮箱SMTP服务,设置邮箱SMTP授权码"><a href="#2-打开邮箱SMTP服务,设置邮箱SMTP授权码" class="headerlink" title="2. 打开邮箱SMTP服务,设置邮箱SMTP授权码"></a>2. 打开邮箱SMTP服务,设置邮箱SMTP授权码</h5><h5 id="3-开始Coding吧!上代码!"><a href="#3-开始Coding吧!上代码!" class="headerlink" title="3. 开始Coding吧!上代码!"></a>3. 开始Coding吧!上代码!</h5><a id="more"></a>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div></pre></td><td class="code"><pre><div class="line">import javax.mail.*;</div><div class="line">import javax.mail.internet.InternetAddress;</div><div class="line">import javax.mail.internet.MimeMessage;</div><div class="line">import java.util.Properties;</div><div class="line"></div><div class="line">//主类</div><div class="line">public class MailSender {</div><div class="line"></div><div class="line"> private static final String FROM = "kong@163.com"; //发送邮箱,必须和授权邮箱一致</div><div class="line"> private static final String TO = "kong@163.com"; //接收者邮箱,随意</div><div class="line"> private static final String HOST = "smtp.163.com"; //发送邮件服务器</div><div class="line"> private static final String USER = "kong@163.com"; //授权邮箱账户</div><div class="line"> private static final String SMTP_PASSWORD = "xxx"; //SMTP邮箱授权码</div><div class="line"> private static final String SUBJECT = "This is the Subject Line!"; //主题</div><div class="line"> private static final String TEXT = "This is actual message"; //正文</div><div class="line"></div><div class="line"></div><div class="line"> public static void main(String [] args)</div><div class="line"> {</div><div class="line"> Properties properties = System.getProperties();</div><div class="line"> properties.setProperty("mail.smtp.host", HOST);</div><div class="line"> // 需要授权,默认为false</div><div class="line"> properties.setProperty("mail.smtp.auth", "true");</div><div class="line"> Authenticator authenticator = new MyAuth(USER, SMTP_PASSWORD);</div><div class="line"> Session session = Session.getDefaultInstance(properties, authenticator);</div><div class="line"></div><div class="line"> try{</div><div class="line"> // Create a default MimeMessage object.</div><div class="line"> MimeMessage message = new MimeMessage(session);</div><div class="line"></div><div class="line"> // Set From: header field of the header.</div><div class="line"> message.setFrom(new InternetAddress(FROM));</div><div class="line"></div><div class="line"> // Set To: header field of the header.</div><div class="line"> message.addRecipient(Message.RecipientType.TO,</div><div class="line"> new InternetAddress(TO));</div><div class="line"></div><div class="line"> // Set Subject: header field</div><div class="line"> message.setSubject(SUBJECT);</div><div class="line"></div><div class="line"> // Now set the actual message</div><div class="line"> message.setText(TEXT);</div><div class="line"></div><div class="line"> // Send message</div><div class="line"> Transport.send(message);</div><div class="line"> System.out.println("Sent message successfully....");</div><div class="line"> }catch (MessagingException mex) {</div><div class="line"> mex.printStackTrace();</div><div class="line"> }</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div></pre></td><td class="code"><pre><div class="line"></div><div class="line">import javax.mail.*;</div><div class="line"></div><div class="line">//授权</div><div class="line">public class MyAuth extends Authenticator {</div><div class="line"></div><div class="line"> String userName=null;</div><div class="line"> String password=null;</div><div class="line"></div><div class="line"> public MyAuth(){</div><div class="line"> }</div><div class="line"> public MyAuth(String username, String password) {</div><div class="line"> this.userName = username;</div><div class="line"> this.password = password;</div><div class="line"> }</div><div class="line"> protected PasswordAuthentication getPasswordAuthentication(){</div><div class="line"> return new PasswordAuthentication(userName, password);</div><div class="line"> }</div><div class="line"></div><div class="line">}</div></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">依赖pom</div><div class="line"></div><div class="line"><dependency></div><div class="line"> <groupId>javax.mail</groupId></div><div class="line"> <artifactId>mail</artifactId></div><div class="line"> <version>1.4.7</version></div><div class="line"></dependency></div></pre></td></tr></table></figure>
]]></content>
<summary type="html">
<h2 id="通过JavaMail发送邮件"><a href="#通过JavaMail发送邮件" class="headerlink" title="通过JavaMail发送邮件"></a>通过JavaMail发送邮件</h2><blockquote>
<p>最近遇到了一个需要发送邮件的需求,所以了解了一下Java发送邮件的方法。参考网上资料,跑了一个小Demo,特此记录一下。</p>
<p>此Demo可以实现最基本的发邮件功能,还有一些高级功能需要去摸索,比如支持html or markdown,比如添加附件。</p>
</blockquote>
<h5 id="1-申请一个163邮箱账号,kong-163-com"><a href="#1-申请一个163邮箱账号,kong-163-com" class="headerlink" title="1. 申请一个163邮箱账号,kong@163.com"></a>1. 申请一个163邮箱账号,kong@163.com</h5><h5 id="2-打开邮箱SMTP服务,设置邮箱SMTP授权码"><a href="#2-打开邮箱SMTP服务,设置邮箱SMTP授权码" class="headerlink" title="2. 打开邮箱SMTP服务,设置邮箱SMTP授权码"></a>2. 打开邮箱SMTP服务,设置邮箱SMTP授权码</h5><h5 id="3-开始Coding吧!上代码!"><a href="#3-开始Coding吧!上代码!" class="headerlink" title="3. 开始Coding吧!上代码!"></a>3. 开始Coding吧!上代码!</h5>
</summary>
<category term="Java" scheme="http://yoursite.com/categories/Java/"/>
<category term="JavaMail" scheme="http://yoursite.com/tags/JavaMail/"/>
</entry>
<entry>
<title>运维管理平台——Ateye.md</title>
<link href="http://yoursite.com/2017/06/04/Ateye%E4%BB%8B%E7%BB%8D-md/"/>
<id>http://yoursite.com/2017/06/04/Ateye介绍-md/</id>
<published>2017-06-04T13:13:41.000Z</published>
<updated>2017-06-04T13:19:46.000Z</updated>
<content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>Ateye系统是通用的应用运维平台,其具有应用程序行为控制和基于日志的系统监控两大类功能。使用方通过引入Ateye的client包并进行简单设置。</p>
<h2 id="主要功能"><a href="#主要功能" class="headerlink" title="主要功能"></a>主要功能</h2><ul>
<li>方法调用(重点)</li>
<li>动态开关(重点)</li>
<li>日志级别调整</li>
<li>异常监控</li>
<li>KV埋点</li>
</ul>
<a id="more"></a>
<h2 id="基本配置"><a href="#基本配置" class="headerlink" title="基本配置"></a>基本配置</h2><p>在 web.xml 里配置一个 Servlet</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line"><servlet> </div><div class="line"> <servlet-name>ateye</servlet-name> </div><div class="line"> <servlet-class>com.taobao.ateye.servlet.AteyeServlet</servlet-class> </div><div class="line"> <load-on-startup>1</load-on-startup> </div><div class="line"></servlet> </div><div class="line"></div><div class="line"><servlet-mapping> </div><div class="line"> <servlet-name>ateye</servlet-name> </div><div class="line"> <url-pattern>/agent.ateye</url-pattern> </div><div class="line"></servlet-mapping></div></pre></td></tr></table></figure>
<h2 id="基本原理"><a href="#基本原理" class="headerlink" title="基本原理"></a>基本原理</h2><p>ateye-server 通过和 ateye-client 发送http请求进行通信。</p>
<p>ateye-server 负责界面操作,以及一些持久化数据,用户操作记录,应用机器注册的职责。</p>
<p>ateye-client 负责控制应用里的操作,包括通过反射调用方法,改变属性值。</p>
<p>ateye-clinet启动的时候扫描所有Spring注册的bean,通过反射拿到带有注解的方法和字段。ateye-client监听 /agent.ateye 的请求,然后反射调用方法 或者 直接设置属性值。</p>
<h2 id="系统架构图"><a href="#系统架构图" class="headerlink" title="系统架构图"></a>系统架构图</h2><p><img src="https://img.alicdn.com/tfs/TB1cHdGRFXXXXapXpXXXXXXXXXX-741-661.png" alt=""></p>
]]></content>
<summary type="html">
<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>Ateye系统是通用的应用运维平台,其具有应用程序行为控制和基于日志的系统监控两大类功能。使用方通过引入Ateye的client包并进行简单设置。</p>
<h2 id="主要功能"><a href="#主要功能" class="headerlink" title="主要功能"></a>主要功能</h2><ul>
<li>方法调用(重点)</li>
<li>动态开关(重点)</li>
<li>日志级别调整</li>
<li>异常监控</li>
<li>KV埋点</li>
</ul>
</summary>
<category term="我在阿里学到的" scheme="http://yoursite.com/categories/%E6%88%91%E5%9C%A8%E9%98%BF%E9%87%8C%E5%AD%A6%E5%88%B0%E7%9A%84/"/>
<category term="Java" scheme="http://yoursite.com/tags/Java/"/>
</entry>
<entry>
<title>【全栈之路】Node.js爬虫(一)</title>
<link href="http://yoursite.com/2016/11/22/%E3%80%90%E5%85%A8%E6%A0%88%E4%B9%8B%E8%B7%AF%E3%80%91Node-js%E7%88%AC%E8%99%AB%EF%BC%88%E4%B8%80%EF%BC%89/"/>
<id>http://yoursite.com/2016/11/22/【全栈之路】Node-js爬虫(一)/</id>
<published>2016-11-21T18:01:08.000Z</published>
<updated>2017-05-27T08:19:56.000Z</updated>
<content type="html"><![CDATA[<h3 id="使用nodejs爬取知乎的内容,然后在web中显示出来"><a href="#使用nodejs爬取知乎的内容,然后在web中显示出来" class="headerlink" title="使用nodejs爬取知乎的内容,然后在web中显示出来"></a>使用nodejs爬取知乎的内容,然后在web中显示出来</h3><blockquote>
<p><a href="https://www.zhihu.com/explore#daily-hot" target="_blank" rel="external">知乎发现URL</a></p>
<p>统计今日最热的问题和回答</p>
</blockquote>
<ul>
<li>使用request发起http请求</li>
<li>使用了cheerio解析html</li>
<li>使用了mysql保存抓取的数据</li>
<li>使用了express作web展示</li>
</ul>
<h2 id=""><a href="#" class="headerlink" title=""></a><a id="more"></a></h2><ul>
<li><p>字段包括</p>
<ul>
<li>问题title</li>
<li>热门回答url</li>
<li>回答者姓名</li>
<li>点赞数</li>
<li>回答者badge</li>
<li>回答者title</li>
<li>回答内容摘要</li>
<li>评论数</li>
</ul>
</li>
<li><p>设计</p>
<ul>
<li>fetcher.js: 负责下载网页</li>
<li>parser.js: 解析html返回需要保存的数据</li>
<li>zhihuDao.js: 数据表的操作</li>
</ul>
</li>
</ul>
<hr>
<h4 id="1-下载网页"><a href="#1-下载网页" class="headerlink" title="1. 下载网页"></a>1. 下载网页</h4><p><a href="#1">fetcher.js</a></p>
<p>使用request库,很简单</p>
<h4 id="2-解析网页"><a href="#2-解析网页" class="headerlink" title="2. 解析网页"></a>2. 解析网页</h4><p><a href="#2">parser.js</a></p>
<p>打开<a href="https://www.zhihu.com/explore#daily-hot" target="_blank" rel="external">知乎的发现页面</a>,使用Chrome开发者工具仔细研究想要获取的数据对应的html元素在哪里。</p>
<p><img src="/images/2.png" alt="2.png"></p>
<p>发现每一个热门的item都对应着一个class=”explore-feed feed-item”的div,Good!</p>
<p>首先挑选出所有的item</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$(<span class="string">'.explore-feed.feed-item'</span>).each</div></pre></td></tr></table></figure>
<p><a href="http://www.w3school.com.cn/jquery/traversing_each.asp" target="_blank" rel="external">jQuery遍历each()方法</a></p>
<ul>
<li>再根据<a href="http://www.w3school.com.cn/jquery/jquery_ref_selectors.asp" target="_blank" rel="external">jQuery选择器语法</a>,基本可以选择出想要的元素<ul>
<li>${a.question_link}: 获取class为question_link的a标签</li>
<li>$(‘.explore-feed.feed-item’): 获取class具有explore-feed且feed-item的元素</li>
<li>$(‘ul’).attr(‘id’): 获取属性</li>
<li>$(‘.badge-summary > a’).text(): 获取class为badge-summary的span标签下的a标签文本</li>
<li>item(‘.summary-wrapper > [title]’): 获取class为summary-wrapper下带有title属性的元素</li>
</ul>
</li>
</ul>
<h4 id="3-保存数据"><a href="#3-保存数据" class="headerlink" title="3. 保存数据"></a>3. 保存数据</h4><p><a href="#3">zhihuDAO.js</a></p>
<p>nodejs连接mysql</p>
<p>新建mysql表zhihu_explore用来存储爬取的数据(以后换成mongodb试试(づ。◕‿‿◕。)づ)</p>
<p><img src="/images/3.png" alt="3.png"></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">insert: </div><div class="line">connection.query(sql, paramArray, function(err, result){})</div></pre></td></tr></table></figure>
<ul>
<li>什么时候需要关闭connection连接?<ul>
<li>在zhihuDAO.js中<code>exports.close</code>导出关闭mysql连接函数</li>
<li>在parser.js中新增一个回调函数用来关闭mysql连接</li>
</ul>
</li>
</ul>
<h4 id="4-抓取数据保存到数据库中"><a href="#4-抓取数据保存到数据库中" class="headerlink" title="4. 抓取数据保存到数据库中"></a>4. 抓取数据保存到数据库中</h4><p><a href="#4">main.js</a></p>
<p><img src="/images/4.png" alt="4.png"></p>
<h4 id="5-启动express展示数据"><a href="#5-启动express展示数据" class="headerlink" title="5. 启动express展示数据"></a>5. 启动express展示数据</h4><p><img src="/images/1.png" alt="1.png"></p>
<hr>
<h4 id="附源码"><a href="#附源码" class="headerlink" title="附源码"></a>附源码</h4><p><a name="1"><br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// fetcher.js</span></div><div class="line"><span class="keyword">var</span> request = <span class="built_in">require</span>(<span class="string">'request'</span>)</div><div class="line"><span class="keyword">var</span> zhihuDAO = <span class="built_in">require</span>(<span class="string">'../scrapy/zhihuDAO'</span>)</div><div class="line"></div><div class="line">exports.fetch = <span class="function"><span class="keyword">function</span> (<span class="params">url, callback</span>) </span>{</div><div class="line"> request(url, <span class="function"><span class="keyword">function</span> (<span class="params">error, response, body</span>) </span>{</div><div class="line"> <span class="keyword">if</span> (!error && response.statusCode == <span class="number">200</span>) {</div><div class="line"> callback(body, zhihuDAO.insert, zhihuDAO.close)</div><div class="line"> }</div><div class="line"> })</div><div class="line">}</div></pre></td></tr></table></figure></a></p>
<p></p>
<p><a name="2"><br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// parser.js</span></div><div class="line"><span class="keyword">var</span> cheerio = <span class="built_in">require</span>(<span class="string">'cheerio'</span>);</div><div class="line"></div><div class="line">exports.parse = <span class="function"><span class="keyword">function</span> (<span class="params">html, callback, final</span>) </span>{</div><div class="line"> <span class="keyword">var</span> $ = cheerio.load(html);</div><div class="line"> $(<span class="string">'.explore-feed.feed-item'</span>).each(<span class="function"><span class="keyword">function</span> (<span class="params">index, element</span>) </span>{</div><div class="line"> <span class="keyword">var</span> item = cheerio.load(element);</div><div class="line"> <span class="keyword">var</span> question_title = item(<span class="string">'a.question_link'</span>).text();</div><div class="line"> <span class="keyword">var</span> question_url = item(<span class="string">'a.question_link'</span>).attr(<span class="string">'href'</span>);</div><div class="line"> <span class="keyword">var</span> answer_name = item(<span class="string">'.author-link'</span>).text();</div><div class="line"> <span class="keyword">var</span> support_count = item(<span class="string">'.zm-item-vote-count.js-expand.js-vote-count'</span>).text();</div><div class="line"> <span class="keyword">var</span> answer_badge = item(<span class="string">'.badge-summary > a'</span>).text();</div><div class="line"> <span class="keyword">var</span> answer_title = item(<span class="string">'.summary-wrapper > [title]'</span>).attr(<span class="string">'title'</span>);</div><div class="line"> <span class="keyword">var</span> answer_content_summary = item(<span class="string">'.zh-summary.summary.clearfix'</span>).text();</div><div class="line"> <span class="keyword">var</span> answer_content_pic = item(<span class="string">'.zh-summary.summary.clearfix > img'</span>).attr(<span class="string">'src'</span>);</div><div class="line"> answer_content_pic = answer_content_pic===<span class="literal">undefined</span>?<span class="string">''</span>:answer_content_pic;</div><div class="line"> <span class="keyword">var</span> comment_count = item(<span class="string">'.meta-item.toggle-comment.js-toggleCommentBox'</span>).text();</div><div class="line"></div><div class="line"> <span class="keyword">var</span> param = [removeN(question_title),</div><div class="line"> removeN(question_url),</div><div class="line"> removeN(answer_name),</div><div class="line"> removeN(support_count),</div><div class="line"> removeN(answer_badge),</div><div class="line"> removeN(answer_title),</div><div class="line"> removeN(answer_content_pic)+<span class="string">' '</span>+removeN(answer_content_summary),</div><div class="line"> removeN(comment_count)];</div><div class="line"> callback(param)</div><div class="line"></div><div class="line"> });</div><div class="line"> final()</div><div class="line">};</div><div class="line"></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">removeN</span>(<span class="params">str</span>) </span>{</div><div class="line"> <span class="keyword">var</span> res = <span class="string">''</span>;</div><div class="line"> <span class="keyword">if</span> (str) {</div><div class="line"> res= str.replace(<span class="regexp">/\\n/g</span>, <span class="string">''</span>);</div><div class="line"> }<span class="keyword">else</span> {</div><div class="line"> res = str;</div><div class="line"> }</div><div class="line"> <span class="keyword">return</span> res;</div><div class="line">}</div></pre></td></tr></table></figure></a></p>
<p></p>
<p><a name="3"><br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// zhihuDAO.js</span></div><div class="line"><span class="keyword">var</span> mysql = <span class="built_in">require</span>(<span class="string">'mysql'</span>)</div><div class="line"></div><div class="line"><span class="keyword">var</span> connection = mysql.createConnection({</div><div class="line"> <span class="attr">host</span>:<span class="string">'xxx'</span>,</div><div class="line"> <span class="attr">user</span>:<span class="string">'xxx'</span>,</div><div class="line"> <span class="attr">password</span>:<span class="string">'xxx'</span>,</div><div class="line"> <span class="attr">database</span>:<span class="string">'xxx'</span></div><div class="line">});</div><div class="line">connection.connect();</div><div class="line"></div><div class="line">exports.insert = <span class="function"><span class="keyword">function</span> (<span class="params">param</span>) </span>{</div><div class="line"></div><div class="line"> connection.query(<span class="string">'insert into zhihu_explore(qustion_title, answer_url, answer_name, support_count, answer_badge, answer_title, answer_content_summary, comment_count) values (?,?,?,?,?,?,?,?)'</span>, param, <span class="function"><span class="keyword">function</span>(<span class="params">err, result</span>) </span>{</div><div class="line"> <span class="keyword">if</span> (err) {</div><div class="line"> <span class="built_in">console</span>.log(<span class="string">'insert error - '</span>, err.message)</div><div class="line"> <span class="keyword">return</span> ;</div><div class="line"> }</div><div class="line"> })</div><div class="line">}</div><div class="line"></div><div class="line">exports.close = <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>{</div><div class="line"> connection.end()</div><div class="line">}</div></pre></td></tr></table></figure></a></p>
<p></p>
<p><a name="4"><br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// main.js</span></div><div class="line"><span class="keyword">var</span> fetcher = <span class="built_in">require</span>(<span class="string">'../scrapy/fetcher'</span>);</div><div class="line"><span class="keyword">var</span> parser = <span class="built_in">require</span>(<span class="string">'../scrapy/parser'</span>);</div><div class="line">fetcher.fetch(<span class="string">'https://www.zhihu.com/explore'</span>, parser.parse);</div><div class="line"></div><div class="line"><span class="comment">// node main.js</span></div></pre></td></tr></table></figure></a></p>
<p></p>
]]></content>
<summary type="html">
<h3 id="使用nodejs爬取知乎的内容,然后在web中显示出来"><a href="#使用nodejs爬取知乎的内容,然后在web中显示出来" class="headerlink" title="使用nodejs爬取知乎的内容,然后在web中显示出来"></a>使用nodejs爬取知乎的内容,然后在web中显示出来</h3><blockquote>
<p><a href="https://www.zhihu.com/explore#daily-hot">知乎发现URL</a></p>
<p>统计今日最热的问题和回答</p>
</blockquote>
<ul>
<li>使用request发起http请求</li>
<li>使用了cheerio解析html</li>
<li>使用了mysql保存抓取的数据</li>
<li>使用了express作web展示</li>
</ul>
<h2 id=""><a href="#" class="headerlink" title=""></a>
</summary>
<category term="全栈之路" scheme="http://yoursite.com/categories/%E5%85%A8%E6%A0%88%E4%B9%8B%E8%B7%AF/"/>
<category term="Node.js" scheme="http://yoursite.com/tags/Node-js/"/>
</entry>
<entry>
<title>【全栈之路】基础(一)</title>
<link href="http://yoursite.com/2016/11/21/%E3%80%90%E5%85%A8%E6%A0%88%E4%B9%8B%E8%B7%AF%E3%80%91%E5%9F%BA%E7%A1%80%EF%BC%88%E4%B8%80%EF%BC%89/"/>
<id>http://yoursite.com/2016/11/21/【全栈之路】基础(一)/</id>
<published>2016-11-20T17:24:21.000Z</published>
<updated>2017-05-27T08:20:12.000Z</updated>
<content type="html"><![CDATA[<h3 id="不懂就问,打好基础"><a href="#不懂就问,打好基础" class="headerlink" title="不懂就问,打好基础"></a>不懂就问,打好基础</h3><hr>
<ol>
<li>什么是sass、less?<ul>
<li>css的预处理工具,目前用不上</li>
</ul>
</li>
<li>什么是bower?<ul>
<li>js包管理器</li>
<li>bower依然依赖npm,相比较npm的优势在于自定义依赖的下载目录结构</li>
<li>实际项目中,使用npm作用于后端,使用bower作用于前端</li>
</ul>
</li>
<li>上手express<ul>
<li>express的路由方法<ul>
<li>app.METHOD(path, [callback…], callback), app 是 express 对象的一个实例, METHOD 是一个 HTTP 请求方法, path 是服务器上的路径, callback 是当路由匹配时要执行的函数</li>
<li>路由句柄:区别在于路由句柄的function参数有一个next,调用next()函数可以将请求交给下一个callback处理,app.METHOD调用的时候指定一个callback数组</li>
<li>res.render()将会渲染视图模板,如jade模板</li>
<li>无论是app.use(“/“, router)还是app.get(“/“, router.function)还是app.get(“/“, callback),本质上都是app.get(“/“, callback</li>
</ul>
</li>
</ul>
</li>
<li>require模块化之 module.exports vs exports<a id="more"></a>
<ul>
<li>使用了module.exports之后,exports方法失效</li>
<li>使用module.exports,导出的模块是一个整体,可以是一个类,可以是一个数组,可以是任何合法的JavaScript对象,添加属性使用module.exports.name</li>
<li><a href="#1">module.exports举例</a></li>
<li>使用exports,导出的模块是一个实例化对象,可以直接使用exports.xxx导出的属性</li>
<li><a href="#2">exports举例</a></li>
</ul>
</li>
</ol>
<p><a name="1"><br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div></pre></td><td class="code"><pre><div class="line"><span class="built_in">module</span>.exports举例<span class="number">1</span>: </div><div class="line"><!-- roker.js --></div><div class="line">module.exports = function(name, age) {</div><div class="line"> this.name = name;</div><div class="line"> this.age = age;</div><div class="line"> this.about = function() {</div><div class="line"> console.log(this.name +' is '+ this.age +' years old');</div><div class="line"> };</div><div class="line">};</div><div class="line"><!-- 在另一个文件中你这样引用 --></div><div class="line">var Rocker = require('./rocker.js');</div><div class="line">var r = new Rocker('Ozzy', 62);</div><div class="line">r.about(); // Ozzy is 62 years old</div><div class="line"></div><div class="line"></div><div class="line">module.exports举例2: </div><div class="line"><!-- roker.js --></div><div class="line">module.exports = ['Lemmy Kilmister', 'Ozzy Osbourne', 'Ronnie James Dio', 'Steven Tyler', 'Mick Jagger'];</div><div class="line"><!-- 在另一个文件中你这样引用 --></div><div class="line">var rocker = require('./rocker.js');</div><div class="line">console.log('Rockin in heaven: ' + rocker[2]); //Rockin in heaven: Ronnie James Dio</div></pre></td></tr></table></figure></a></p>
<p></p>
<p><a name="2"><br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">exports举例: </div><div class="line"><!-- roker.js --></div><div class="line">exports.name = function() {</div><div class="line"> console.log('My name is Lemmy Kilmister');</div><div class="line">};</div><div class="line"><!-- 在另一个文件中你这样引用 --></div><div class="line">var rocker = require('./rocker.js');</div><div class="line">rocker.name(); // 'My name is Lemmy Kilmister'</div></pre></td></tr></table></figure></a></p>
<p></p>
<hr>
<h3 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h3><ul>
<li><a href="http://www.cnblogs.com/pigtail/archive/2013/01/14/2859555.html" target="_blank" rel="external">nodejs中exports与module.exports的区别</a></li>
</ul>
]]></content>
<summary type="html">
<h3 id="不懂就问,打好基础"><a href="#不懂就问,打好基础" class="headerlink" title="不懂就问,打好基础"></a>不懂就问,打好基础</h3><hr>
<ol>
<li>什么是sass、less?<ul>
<li>css的预处理工具,目前用不上</li>
</ul>
</li>
<li>什么是bower?<ul>
<li>js包管理器</li>
<li>bower依然依赖npm,相比较npm的优势在于自定义依赖的下载目录结构</li>
<li>实际项目中,使用npm作用于后端,使用bower作用于前端</li>
</ul>
</li>
<li>上手express<ul>
<li>express的路由方法<ul>
<li>app.METHOD(path, [callback…], callback), app 是 express 对象的一个实例, METHOD 是一个 HTTP 请求方法, path 是服务器上的路径, callback 是当路由匹配时要执行的函数</li>
<li>路由句柄:区别在于路由句柄的function参数有一个next,调用next()函数可以将请求交给下一个callback处理,app.METHOD调用的时候指定一个callback数组</li>
<li>res.render()将会渲染视图模板,如jade模板</li>
<li>无论是app.use(“/“, router)还是app.get(“/“, router.function)还是app.get(“/“, callback),本质上都是app.get(“/“, callback</li>
</ul>
</li>
</ul>
</li>
<li>require模块化之 module.exports vs exports
</summary>
<category term="全栈之路" scheme="http://yoursite.com/categories/%E5%85%A8%E6%A0%88%E4%B9%8B%E8%B7%AF/"/>
<category term="JavaScript" scheme="http://yoursite.com/tags/JavaScript/"/>
<category term="express" scheme="http://yoursite.com/tags/express/"/>
<category term="less" scheme="http://yoursite.com/tags/less/"/>
<category term="sass" scheme="http://yoursite.com/tags/sass/"/>
</entry>
<entry>
<title>Hello World</title>
<link href="http://yoursite.com/2016/11/18/hello-world/"/>
<id>http://yoursite.com/2016/11/18/hello-world/</id>
<published>2016-11-17T19:35:16.000Z</published>
<updated>2016-11-17T19:35:16.000Z</updated>
<content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/" target="_blank" rel="external">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/" target="_blank" rel="external">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html" target="_blank" rel="external">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues" target="_blank" rel="external">GitHub</a>.</p>
<h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><a id="more"></a>
<h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ hexo new <span class="string">"My New Post"</span></div></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/writing.html" target="_blank" rel="external">Writing</a></p>
<h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ hexo server</div></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/server.html" target="_blank" rel="external">Server</a></p>
<h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ hexo generate</div></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/generating.html" target="_blank" rel="external">Generating</a></p>
<h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ hexo deploy</div></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/deployment.html" target="_blank" rel="external">Deployment</a></p>
]]></content>
<summary type="html">
<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p>
<h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2>
</summary>
<category term="me" scheme="http://yoursite.com/categories/me/"/>
<category term="hello world" scheme="http://yoursite.com/tags/hello-world/"/>
</entry>
<entry>
<title>一次日志打印问题的排查</title>
<link href="http://yoursite.com/2016/04/04/log-bug/"/>
<id>http://yoursite.com/2016/04/04/log-bug/</id>
<published>2016-04-03T18:23:08.000Z</published>
<updated>2016-11-17T19:33:43.000Z</updated>
<content type="html"><![CDATA[<h2 id="问题现象"><a href="#问题现象" class="headerlink" title="问题现象"></a>问题现象</h2><p>测试服务器上无日志打印。</p>
<h2 id="原因分析"><a href="#原因分析" class="headerlink" title="原因分析"></a>原因分析</h2><p>第一次遇到这种情况,构建成功,部署成功,然后打日志毫无反应。</p>
<p>于是我开始怀疑人生…可是不是解决办法呀!</p>
<a id="more"></a>
<p>于是我重新拉了一个崭新的线上分支部署到测试机上去,发现日志可以正常打印!</p>
<p>恩…仔细回想了一下我对开发分支的改动中…怀疑是因为修改了maven依赖导致日志的jar包冲突导致的。</p>
<p>跑到测试机上分别查询了加载的jar包,果然如此!</p>
<p><em>正常日志依赖:</em></p>
<p><img src="/images/good-lib.jpg" alt="正常日志依赖"></p>
<p><em>异常日志依赖:</em></p>
<p><img src="/images/bad-lib.jpg" alt="异常日志依赖"></p>
<p>对比得出,应该就是因为<code>logback-classic</code>和<code>logback-core</code>的依赖导致了日志打不出来。(该系统一直使用log4j日志框架)</p>
<h2 id="问题解决"><a href="#问题解决" class="headerlink" title="问题解决"></a>问题解决</h2><p>在项目根目录运行<code>mvn dependency:tree > tree</code>,打印maven依赖树。</p>
<p>排除掉所有对logback的直接和间接依赖即可。</p>
<p><strong>为了一劳永逸,直接在主pom.xml中dependencyManagement依赖logback的999-not-exist版本(空jar包)。</strong></p>
<h2 id="深入分析"><a href="#深入分析" class="headerlink" title="深入分析"></a>深入分析</h2><p>以上,问题的确解决了。</p>
<p><strong>But 究竟为什么logback包的依赖引入进来,日志就不打印了呢?</strong></p>
<p>为了解决这个疑惑,经过一番资料查询,结论是这样的:</p>
<p><strong>slf4j-log4j12.jar 与 logback-classic.jar 互斥,二者只能存在其一。</strong></p>
<h2 id="详细拓展:"><a href="#详细拓展:" class="headerlink" title="详细拓展:"></a>详细拓展:</h2><p>日志框架分为 <strong>接口框架</strong> 和 <strong>实现框架</strong></p>
<p>接口框架包括 Apache Common Logging(之前叫 Jakarta Commons Logging,JCL)和SLF4J。</p>
<p>实现框架包括 log4j 和 logback。</p>
<p><em>他们之间的关系如下图:</em></p>
<p><img src="/images/log.jpg" alt="架构图"></p>
<p>其中JCL-over-SLF4j的存在,是因为有些项目中已经采用了JCL架构的(因为出现的早)想要转换到SLF4J架构(因为性能高)而存在的一个桥接器。顾名思义,名字为 XXX-over-slf4j 表示将日志重定向到了slf4j中。</p>
<p><strong>由于JCL-over-SLF4J和原来的JCL具有完全相同的API,因此两者是不能共存的。排除JCL依赖的方法为将<code>commons-logging</code> 设置成<code><scope>provided</scope></code> 或者 依赖一个<code>99.0-does-not-exist</code>版本的<code>commons-logging</code>(一个空无一物的特殊jar包)</strong></p>
<p>具体的jar包调用关系为:(假设采用slf4j + log4j的组合)</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">commons-logging log</div><div class="line">-> jcl-over-slf4j</div><div class="line">-> slf4j-api</div><div class="line">-> slf4j-log4j12</div><div class="line">-> log4j</div><div class="line">-> 输出日志</div></pre></td></tr></table></figure>
<p>当既依赖了slf4j-log4j12,又依赖了logback-classic时,slf4j会产生让人非常迷惑的结果。</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">LoggerFactory.getLogger(xxx.class);</div></pre></td></tr></table></figure>
<p>跟进getLogger方法中</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">ILoggerFactory iLoggerFactory = getILoggerFactory();</div><div class="line"><span class="keyword">return</span> iLoggerFactory.getLogger(name);</div></pre></td></tr></table></figure>
<p>使用了getILoggerFactory()返回的工厂,跟进getILoggerFactory方法中</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> ILoggerFactory <span class="title">getILoggerFactory</span><span class="params">()</span> </span>{</div><div class="line"> <span class="keyword">if</span> (INITIALIZATION_STATE == UNINITIALIZED) {</div><div class="line"> INITIALIZATION_STATE = ONGOING_INITIALIZATION;</div><div class="line"> <span class="comment">//初始化</span></div><div class="line"> performInitialization();</div><div class="line"> }</div><div class="line"> <span class="keyword">switch</span> (INITIALIZATION_STATE) {</div><div class="line"> <span class="keyword">case</span> SUCCESSFUL_INITIALIZATION:</div><div class="line"> <span class="keyword">return</span> StaticLoggerBinder.getSingleton().getLoggerFactory();</div><div class="line"> <span class="keyword">case</span> NOP_FALLBACK_INITIALIZATION:</div><div class="line"> <span class="keyword">return</span> NOP_FALLBACK_FACTORY;</div><div class="line"> <span class="keyword">case</span> FAILED_INITIALIZATION:</div><div class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(UNSUCCESSFUL_INIT_MSG);</div><div class="line"> <span class="keyword">case</span> ONGOING_INITIALIZATION:</div><div class="line"> <span class="comment">// support re-entrant behavior.</span></div><div class="line"> <span class="comment">// See also http://bugzilla.slf4j.org/show_bug.cgi?id=106</span></div><div class="line"> <span class="keyword">return</span> TEMP_FACTORY;</div><div class="line"> }</div><div class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(<span class="string">"Unreachable code"</span>); </div><div class="line">}</div></pre></td></tr></table></figure>
<p>上面的代码中,先初始化,然后根据初始化的结果来选择LoggerFactory。进入performInitialization()方法中</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">private</span> <span class="keyword">final</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">performInitialization</span><span class="params">()</span> </span>{</div><div class="line"> bind();</div><div class="line"> <span class="keyword">if</span> (INITIALIZATION_STATE == SUCCESSFUL_INITIALIZATION) {</div><div class="line"> versionSanityCheck();</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
<p>初始化代码中,主要完成slf4j与具体的日志实现绑定的逻辑,进入bind方法中</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">Set staticLoggerBinderPathSet = findPossibleStaticLoggerBinderPathSet();</div><div class="line"><span class="comment">// 多绑定情况打印</span></div><div class="line">reportMultipleBindingAmbiguity(staticLoggerBinderPathSet);</div><div class="line"><span class="comment">// 进行绑定</span></div><div class="line">StaticLoggerBinder.getSingleton();</div><div class="line">INITIALIZATION_STATE = SUCCESSFUL_INITIALIZATION;</div><div class="line"><span class="comment">// 打印真正的绑定实现</span></div><div class="line">reportActualBinding(staticLoggerBinderPathSet);</div><div class="line">emitSubstituteLoggerWarning();</div></pre></td></tr></table></figure>
<p>在findPossibleStaticLoggerBinderPathSet()中,寻找<code>org/slf4j/impl/StaticLoggerBinder.class</code>接口的实现类,而slf4j-log4j21和logback-classic中都有对应的实现类,当两者都存在时,<code>reportActualBinding</code>的打印情况如下:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]</div></pre></td></tr></table></figure>
<p><code>reportMultipleBindingAmbiguity</code>的打印如下:</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">SLF4J: Found binding in [jar:file:/home/admin/msggrab/target/msggrab.war/WEB-INF/lib/logback-classic<span class="number">-1.0</span><span class="number">.13</span>.jar!/org/slf4j/impl/StaticLoggerBinder.<span class="keyword">class</span>]</div><div class="line">SLF4J: Found binding in [jar:file:/home/admin/msggrab/target/msggrab.war/WEB-INF/lib/slf4j-log4j12<span class="number">-1.7</span><span class="number">.5</span>.jar!/org/slf4j/impl/StaticLoggerBinder.<span class="keyword">class</span>]</div><div class="line">SLF4J: See http:<span class="comment">//www.slf4j.org/codes.html#multiple_bindings for an explanation.</span></div></pre></td></tr></table></figure>
<h3 id="而我之所以打不出日志,是因为最终选择了logback作为了StaticLoggerBinder-class的实现,如下图"><a href="#而我之所以打不出日志,是因为最终选择了logback作为了StaticLoggerBinder-class的实现,如下图" class="headerlink" title="而我之所以打不出日志,是因为最终选择了logback作为了StaticLoggerBinder.class的实现,如下图"></a>而我之所以打不出日志,是因为最终选择了logback作为了<code>StaticLoggerBinder.class</code>的实现,如下图</h3><p><img src="/images/debug.jpg" alt="debug"></p>
<p><strong>可是,为什么当slf4j-log4j12和logback都存在的情况下,会优先使用logback呢???</strong></p>
<p>…</p>
]]></content>
<summary type="html">
<h2 id="问题现象"><a href="#问题现象" class="headerlink" title="问题现象"></a>问题现象</h2><p>测试服务器上无日志打印。</p>
<h2 id="原因分析"><a href="#原因分析" class="headerlink" title="原因分析"></a>原因分析</h2><p>第一次遇到这种情况,构建成功,部署成功,然后打日志毫无反应。</p>
<p>于是我开始怀疑人生…可是不是解决办法呀!</p>
</summary>
</entry>
</feed>