整合營(yíng)銷(xiāo)服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          使用log4j2打印日志

          使用log4j2打印日志

          LF4J

          首先映入眼簾的是slf4j,全稱(chēng)是Simple Logging Facade for Java。從名字可以看出來(lái)這是一個(gè)日志框架,采用了Facade的設(shè)計(jì)模式,說(shuō)白了,這是一個(gè)日志框架接口,應(yīng)用程序里使用slf4j的接口來(lái)打印日志,具體的日志框架可以自由選擇,這樣做是為了方便適配不同的日志框架,比如logback,log4j2等。

          官方網(wǎng)站是 http://www.slf4j.org/index.html

          Log4j

          log4j是apache的開(kāi)源項(xiàng)目,現(xiàn)在已經(jīng)到2.0版本,所以也叫l(wèi)og4j2,官方網(wǎng)站是

          http://logging.apache.org/log4j/2.x/index.html


          所以本文的日志打印就是通過(guò)應(yīng)用程序里使用slf4j的接口,然后具體的日志框架是log4j2。

          實(shí)驗(yàn)代碼都在上傳在 https://gitee.com/kunpengku/learn-log4j


          添加maven依賴(lài)

          首先需要增加對(duì)日志框架包的依賴(lài),如下

          <dependencies>
              <!-- 這個(gè)依賴(lài)是slf4j的api-->
              <dependency>
                  <groupId>org.slf4j</groupId>
                  <artifactId>slf4j-api</artifactId>
                  <version>1.7.28</version>
              </dependency>
              <!--下面這兩個(gè)依賴(lài)是log4j2的實(shí)現(xiàn)-->
              <dependency>
                  <groupId>org.apache.logging.log4j</groupId>
                  <artifactId>log4j-api</artifactId>
                  <version>2.13.3</version>
              </dependency>
              <dependency>
                  <groupId>org.apache.logging.log4j</groupId>
                  <artifactId>log4j-core</artifactId>
                  <version>2.13.3</version>
              </dependency>
               <!-- 下面這個(gè)依賴(lài)是 log4j 橋接slf4j用的-->
              <dependency>
                  <groupId>org.apache.logging.log4j</groupId>
                  <artifactId>log4j-slf4j-impl</artifactId>
                  <version>2.13.3</version>
              </dependency>
          </dependencies>

          HelloWorld打印

          import org.slf4j.Logger;
          import org.slf4j.LoggerFactory;
          
          public class LogMain {
          
              static Logger logger=LoggerFactory.getLogger(LogMain.class);
          
              public static void main(String[] args) {
                  logger.error("Hello World");
              }
          
          }

          這就log4j的helloworld,這是還沒(méi)有任何的配置文件,這時(shí),log4j會(huì)提供一個(gè)默認(rèn)的配置文件,只能輸出到console上,這里要注意,默認(rèn)配置的Log Level是ERROR的,所以只有ERROR級(jí)別及其以上的打印才能輸出看到,如果這里打印一個(gè)info的日志,是不會(huì)輸出到屏幕的,因?yàn)榧?jí)別太低,過(guò)濾掉了。

          輸出

          08:17:18.767 [main] ERROR com.kpk.LogMain - Hello World

          未完待續(xù)

          .修改application.properties配置文件

          #日志配置文件
          logging.config=classpath:logback-spring.xml
          #日志全局等級(jí)(自定義)
          log.level=INFO
          #日志保存路徑(自定義)
          log.path=C:/BIN_WNMP/nginx/html/taskservice/logs
          #單個(gè)日志大小(自定義)
          log.MaxFileSize=10MB
          #日志文件保留天數(shù)(自定義)
          log.MaxHistory=7
          

          不同的環(huán)境我們可以定義不同log.level和log.path,一般開(kāi)發(fā)和測(cè)試我們希望日志等級(jí)為INFO,而生產(chǎn)我們僅希望記錄WARN以上級(jí)別的日志

          2.logback-spring.xml放在resources下面

          前幫客戶做合同和協(xié)議打印的時(shí)候,收集過(guò)一些打印相關(guān)的資料,整理了一下內(nèi)容,分享給有需要的朋友。

          • 如何發(fā)起打印
          • 如何只局部打印
          • 分頁(yè)
          • 不詢問(wèn)直接打印
          • 無(wú)邊距打印
          • 自定義頁(yè)碼
          • 橫向打印
          • 雙面打印
          • 打印多份

          發(fā)起打印的方法

          1. window.print() 打印整個(gè)頁(yè)面,所有主要瀏覽器都支持 print() 方法,執(zhí)行后會(huì)啟動(dòng)一個(gè)打印對(duì)話框,Chrome的打印對(duì)話框自帶預(yù)覽功能,IE、火狐只彈出打印設(shè)置對(duì)話框,沒(méi)有預(yù)覽功能。
          2. document.execCommand("print") 該方式也兼容各個(gè)版本的瀏覽器,功能同window.print()一樣,不過(guò)已經(jīng)不建議使用了。
          3. 使用html 標(biāo)簽<object>引入Webbrowser控件,這種方式只兼容IE,部分調(diào)用方式如下:

          <body>
            <object id="WebBrowser" classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height="0" width="0"></object>
          </body>
          <script>
            WebBrowser.ExecWB(1,1) // 打開(kāi) 
            WebBrowser.ExecWB(2,1) // 關(guān)閉現(xiàn)在所有的IE窗口,并打開(kāi)一個(gè)新窗口 
            WebBrowser.ExecWB(4,1) // 保存網(wǎng)頁(yè)
            //--------------- 常用 --------------
            WebBrowser.ExecWB(6,1) // 打印
            WebBrowser.ExecWB(6,6) // 直接打印
            WebBrowser.ExecWB(7,1) // 打印預(yù)覽
            WebBrowser.ExecWB(8,1) // 打印頁(yè)面設(shè)置
            //------------------------------------- 
            WebBrowser.ExecWB(10,1) // 查看頁(yè)面屬性
            WebBrowser.ExecWB(15,1) // 撤銷(xiāo)
            WebBrowser.ExecWB(17,1) // 全選
            WebBrowser.ExecWB(22,1) // 刷新
            WebBrowser.ExecWB(45,1) // 關(guān)閉窗體無(wú)提示
          </script>

          1. 直接用JQuery插件
            • jquery.print.js 地址:https://github.com/DoersGuild/jQuery.print
            • jquery.print-preview.js 地址:https://github.com/etimbo/jquery-print-preview-plugin

          通過(guò)$("#id").print(/options/)和$('#id').printArea(/options/)調(diào)用,其中的options可以配置一些選項(xiàng),具體看對(duì)應(yīng)的說(shuō)明文檔。

          1. 采用第三方瀏覽器插件

          收費(fèi)的、不收費(fèi)的都有,這里就不多提了。

          復(fù)雜的套打可以選第三方插件。jQuery插件是封裝的print方法,我前幾年給銀行網(wǎng)點(diǎn)做了個(gè)小系統(tǒng)需要局部打印,選了插件,其實(shí)沒(méi)有很理想,需要自己做一些調(diào)整才行。大部分情況用print就能解決。

          局部打印

          頁(yè)面上顯示的內(nèi)容與最終需要打印的內(nèi)容之間總是存在差異的,從兩個(gè)方向解決這個(gè)問(wèn)題,一個(gè)是打印時(shí)只顯示需要打印的部分,另一個(gè)是打印前調(diào)整頁(yè)面的內(nèi)容,只保留需要打印的部分。可以用到下面幾個(gè)方法:

          css media query 可以寫(xiě)一些只在打印時(shí)有效的樣式,例如控制頁(yè)面某個(gè)按鈕打印時(shí)隱藏

          @media print{
              .no-print{
                  display:none
              }
          }

          可以用onbeforeprintonafterprint在打印前重新編輯內(nèi)容,專(zhuān)門(mén)送去打印,打印后又處理回來(lái)。

          function window.onbeforeprint()
          { //將一些不需要打印的隱藏 }
          
          function window.onafterprint()
          { //放開(kāi)隱藏的元素 }
          // polyfill
          // 對(duì)于基于Webkit的瀏覽器,您可以創(chuàng)建一個(gè)等效的結(jié)果window.matchMedia('print')。
          // var mediaQueryList=window.matchMedia('print');
          // mediaQueryList.addListener('change', function(mql) {
          //   if(mql.matches) {
          //     console.log('webkit equivalent of onbeforeprint');
          //   }
          // });

          onbeforeprint 在設(shè)置頁(yè)面打印之后但是在打印對(duì)話框出現(xiàn)之前執(zhí)行 JavaScript

          onafterprint 定義為在設(shè)置頁(yè)面打印且打印對(duì)話框已出現(xiàn)之后,執(zhí)行一段 JavaScript。只有 Internet Explorer 和 Firefox 支持 onafterprint 事件屬性。但是:在 IE 中,onafterprint=屬性在打印對(duì)話框出現(xiàn)之前而不是之后發(fā)生。

          onbeforeprint fired before dialog appears and allows one to change html and so on.onafterprint is fired just before dialog appears. It is not even possible to know, whether document was actually printed or user canceled it. Needless to say about when printing finished (if started at all).Again: no event is available to track anything happened in print dialog, i.e. answer to your question is no.Moreover, I hope what your need will never be implemented, cause this allows to frustrate user. He/she asks to print one document, but got something different.

          改變頁(yè)面內(nèi)容的方式體驗(yàn)比較糟糕,個(gè)人不推薦,jq插件默認(rèn)是用iframe,其實(shí)還可以window.open一個(gè)單獨(dú)的打印頁(yè)面,預(yù)覽和打印都好解決,兩種方式都需要注意樣式表是在原來(lái)的頁(yè)面,需要稍微注意下樣式是否有缺失。

          分頁(yè)

          page-break-before:always;
          page-break-after:always;
          page-break-inside:avoid;

          用樣式可以控制主動(dòng)使用分頁(yè)符,沒(méi)用過(guò)的可以看下這里

          http://www.w3school.com.cn/cssref/pr_print_page-break-after.asp

          不詢問(wèn)直接打印

          有3種辦法,但都有限制

          1. 使用插件實(shí)現(xiàn)

          網(wǎng)上下載ScriptX.cab文件
          下載成功后將文件放在項(xiàng)目某個(gè)目錄下,然后在頁(yè)面body中寫(xiě)上:

          <object id="factory" name="factory" style="display: none" classid="clsid:1663ed61-23eb-11d2-b92f-008048fdd814" codebase="ScriptX.cab" viewastext></object>

          codebase屬性為ScriptX.cab文件的放置路徑(絕對(duì)路徑)
          調(diào)用:factory.printing.Print(false)即可

          1. webbrowser實(shí)現(xiàn)

          需要修改IE瀏覽器安全設(shè)置,否則還是會(huì)彈出對(duì)話框

            • 安全 -> 本地Intranet -> 自定義級(jí)別 - 找到ActiveX控件和插件項(xiàng),選擇對(duì)未標(biāo)記為可安全執(zhí)行的ActiveX控件初始化并執(zhí)行腳本,再選擇啟用
            • 安全 -> 受信任的站點(diǎn) -> 自定義級(jí)別 - 找到ActiveX控件和插件項(xiàng),選擇對(duì)未標(biāo)記為可安全執(zhí)行的ActiveX控件初始化并執(zhí)行腳本,再選擇啟用
            • 安全 -> 受信任的站點(diǎn) -> 站點(diǎn) -> 添加受信任訪問(wèn)站點(diǎn)(如果是訪問(wèn)遠(yuǎn)程那么是對(duì)方IP地址,如果是本地則是本機(jī)IP.例如http://192.168.172.1)

          然后執(zhí)行

          document.getElementById('WebBrowser').ExecWB(6,2,3)
          1. vb實(shí)現(xiàn)結(jié)合webbrowser實(shí)現(xiàn)

          可以使用vb,但是IE11開(kāi)始已經(jīng)被微軟廢棄,無(wú)法執(zhí)行vb代碼了。

          execScript('document.getElementById("WebBrowser").ExecWB 6, 2, 3','vbscript');

          無(wú)邊距打印

          無(wú)邊距打印是打印機(jī)的一種功能,即全幅打印,打印紙不留空白。
          適用于照片打印,廣告打印,海報(bào)打印等。
          目前的主流打印機(jī)都有支持該功能的型號(hào)。
          當(dāng)在應(yīng)用程序中創(chuàng)建用于打印的數(shù)據(jù)時(shí),需要調(diào)整數(shù)據(jù)到打印紙的尺寸。如果應(yīng)用程序中有邊距設(shè)置,應(yīng)確保在打印前將它們?cè)O(shè)為零。
          注意:
          使用此功能進(jìn)行打印將比普通打印要花更長(zhǎng)時(shí)間。
          使用此功能打印輸出的頂部和底部區(qū)域的打印質(zhì)量可能會(huì)下降,或者在上面未列出的介質(zhì)上打印時(shí)該區(qū)域可能會(huì)污損。在打印大量的作業(yè)之前先打印一頁(yè)以檢查打印質(zhì)量。

          自定義頁(yè)碼

          遇到的一個(gè)需求,只打印合同中需要填寫(xiě)數(shù)據(jù)的幾頁(yè),不能使用自帶的頁(yè)碼,所以把自帶的頁(yè)碼去掉,然后寫(xiě)個(gè)div定位到原來(lái)頁(yè)碼的位置,里面的內(nèi)容就可以自己控制了。需要注意:
          1. 頁(yè)面打印區(qū)域的原因,不是在任意打印機(jī)上都可以把頁(yè)碼打印在紙張的邊緣,需要根據(jù)打印機(jī)的可打印區(qū)域調(diào)整。
          2. 頁(yè)碼需要使用到絕對(duì)定位,所以要求打印的內(nèi)容是確定的,目前遇到有這個(gè)需求的,打印內(nèi)容也都是固定的。

          橫向打印

          chrome 支持 @page 規(guī)則

          @page{size : A4 lanscape;}

          雙面打印

          需要在打印首選項(xiàng)中設(shè)置。

          注意:有時(shí)候需要通過(guò)加個(gè)空白頁(yè)來(lái)讓后面的內(nèi)容從新的一張紙開(kāi)始打印。

          打印份數(shù)

          打印設(shè)置里可以修改,不過(guò)很難用程序控制打印份數(shù)??梢郧€實(shí)現(xiàn),在打印的時(shí)候,直接把內(nèi)容重復(fù)N遍再打印一份出來(lái)的就是N份了。

          時(shí)代變得真快,現(xiàn)在的IE都已經(jīng)退出了歷史舞臺(tái)。新框架一個(gè)接一個(gè)冒出來(lái),老系統(tǒng)里的這些老代碼,不知道什么時(shí)候會(huì)消失。


          主站蜘蛛池模板: 国产在线步兵一区二区三区| 精品少妇ay一区二区三区| 国产乱码精品一区二区三区四川| 伊人久久精品无码av一区| 国产麻豆剧果冻传媒一区| 精品无码日韩一区二区三区不卡 | 亚洲色大成网站www永久一区| 国产成人av一区二区三区不卡| 一区二区亚洲精品精华液| 91在线视频一区| 亚洲国产综合精品中文第一区| 国产成人精品无人区一区| 国产一区二区三区免费视频| 国产综合无码一区二区色蜜蜜| 国产精品久久久久一区二区三区| 无码一区二区三区老色鬼| 丝袜人妻一区二区三区| 高清无码一区二区在线观看吞精| 亚洲AV无码一区二区三区久久精品| 亚洲日本精品一区二区| 香蕉久久一区二区不卡无毒影院 | 亚洲av无码一区二区三区不卡| 国产激情一区二区三区| 久久久久人妻精品一区三寸蜜桃| 精品国产不卡一区二区三区| 精品一区二区三区免费观看| 国产一区二区精品久久凹凸| 久久无码人妻精品一区二区三区 | 日本精品一区二区三本中文| 精品国产高清自在线一区二区三区 | 人妻AV一区二区三区精品| 精品无码国产一区二区三区AV| 亚洲色偷偷偷网站色偷一区| 麻豆国产一区二区在线观看| 亚洲高清毛片一区二区| 日韩精品一区二区三区毛片| 精品一区二区三区四区电影| 国产成人片视频一区二区| 97精品国产福利一区二区三区| 国产成人精品一区二区三区免费| 日韩精品一区二区三区中文 |