2015年11月23日 星期一

Elmah 過濾爬蟲機器人


Elmah 過濾爬蟲機器人

ELMAH filter crawler errors


Global.asax file

void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e)
{
    if (HttpContext.Current.Request.UserAgent.Contains("bot"))
        e.Dismiss();
}

2015年10月16日 星期五

Azure SendGrid is Paused



使用Azure 綁定 SendGrid 電子郵件服務已有一段時間,

有天突然無發登入SendGrid了,

去Azure介面看只有看到大大的橘色Paused

這時登入Azure帳號的信箱,有收到SendGrid寄來的暫停通知,

裡面有附上重新認證恢復使用的網址,

連回去後帳號就恢復了!

之前建立的銷售郵件資料也都還在,

結案!

--

後續

有開Azure case 回報問題給微軟技術支援工程師

Azure SendGrid被暫止

目前處理中

2015年7月1日 星期三

Azure SQL Database 備份方案的三種策略



Azure SQL Database 備份方案的三種策略
[1]備份方案1
工具
使用 SqlPackage.exe
方法
非同步異地
頻率
使用本地Server的排程,設定三天或五天一次
成本
資料傳輸費用
說明
可撰寫排程程式自動匯出存至本地端,然後需使用時用手動匯入指定DB
[2]備份方案2
工具
使用 SQL Server Management Studio 2012匯入匯出工具DTSWizard.exe
方法
非同步異地
頻率
一次性(臨時有需要可取得及時線上的)、人工處理不可排程
成本
資料傳輸費用
說明
人工手動備份
[3]備份方案3
工具
使用Windows Azure Blob 儲存體服務自動匯出
方法
備份至異地的儲存體
頻率
可自訂日期與執行備份的時間點、保留備份檔的保存期限、
以及可選擇永遠保留至少一個匯出檔案。
成本
Blob 儲存體費用、從 Blob 儲存體匯出至本地時會產生的資料傳輸費用
說明
雲端自動備份
Windows Azure 計費考量
儲存體:費用是根據使用的空間收費,而計算方式採累進費率和備援等級計算。
 
如需詳細資料與最新資訊,請參閱定價詳細資料文章的<資料管理>一節。
資料傳輸:輸入 Windows Azure 的資料傳輸是免費的。 輸出傳輸則必須支付頻寬使用量的費用,計算方式是根據地區特定的累進費率計算。
 
如需詳細資料,請參閱<定價詳細資料>文章的資料傳輸一節。








2015年5月29日 星期五

[SQL] 加總計算項目個數,並用一個暫時的欄位紀錄



[SQL]


  SELECT [GoodItem], [OrderID], COUNT([GoodItem]) AS CountRecords
  FROM [CustomerOrder]
  where [GoodItem] in ('267','853','8003','107','1801','2091','826')
  Group by [GoodItem], [OrderID]



說明:

FROM在 DB.TABLE [CustomerOrder]

where:找出 [GoodItem] 條件符合    ('267','853','8003','107','1801','2091','826')  的資料

COUNT AS:把每個  [GoodItem]  加總計算項目個數,並用一個暫時的欄位CountRecords 紀錄

Group by :然後組合出一張新的結果 [GoodItem]  [OrderID] [CountRecords]



2015年5月20日 星期三

[雜症] Windows Azure msshrtmi.dll



各種無法載入檔案或組件'XXX'或其相依性的其中之一。 試圖載入格式錯誤的程式。

都遇上了T^T


---------------------------

---------------------------
無法載入檔案或組件'XXX'或其相依性的其中之一。 試圖載入格式錯誤的程式。
---------------------------
確定
---------------------------

如果是WindowsForms

通常去改[組態管理員][平台] 再重新編譯即可。


比較常遇到是dll有版本問題(x86,x64),所以出狀況。

如果是WEB,那要去修改IIS的[應用程式集區]

設定應用程式集區識別
  1. 在 [應用程式集區] 功能頁上,從清單選取應用程式集區。
  2. 在 [動作] 窗格中,按一下 [進階設定]







如果是

無法載入檔案或組件 'msshrtmi, Version=2.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 或其相依性的其中之一。 系統找不到指定的檔案。


這次遇到的情形是
Visual Studio 2012 + Azure SDK for .NET 2014 年 4 月 (2.3 版)

C:\Program Files\Microsoft SDKs\Windows Azure\.NET SDK\2012-06\bin\runtimes\base\x64\msshrtmi.dll

C:\Program Files\Microsoft SDKs\Windows Azure\.NET SDK\2012-06\bin\runtimes\base\x86\msshrtmi.dll

於是我將Visual Studio 2012 的Azure SDK版本升版至

Azure SDK for .NET VS 2012 版 2015 年 3 月 (2.5.1 版)


搞定,收工。





2015年3月2日 星期一

Oracle Listener (監聽器) 設定



因為沒有裝VM

所以每次把這台測試環境電腦的Oracle玩爛了,就重裝

win64_11gR2_database_1of2.zip
win64_11gR2_database_2of2.zip  (需要解壓縮在同一個目錄)

重裝太多次之後,老是有刪不乾淨,或是安裝不完全的問題


這次遇到的問題是

Listener無法正確啟動


事前有先試過:
用SQL Plus 可以登入
用帳/密 : scott/tiger 接著select * from emp; 也可以找到14個資料列

(PS.我的主機在區網有固定的IP,如果你的IP是區網自動取得,
       請將你主機的IP,改成固定的!)

接下來需要修改
D:\app\user\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora
(如果你有不能存檔的問題,請使用管理員權限將目錄資料夾唯讀取消,並增加讀寫權限)


# listener.ora Network Configuration File: D:\app\user\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = D:\app\user\product\11.2.0\dbhome_1)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = ORCL
      (ORACLE_HOME = D:\app\user\product\11.2.0\dbhome_1)
      (SID_NAME = ORCL)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
      (PROTOCOL_STACK =
        (PRESENTATION = GIOP)
        (SESSION = RAW)
      )
    )
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 你主機的IP)(PORT = 1521))
    )
  )

ADR_BASE_LISTENER = D:\app\user\product\11.2.0\dbhome_1\log





cmd指令:lsnrctl start

LSNRCTL for 64-bit Windows: Version 11.2.0.1.0 - Production on 02-3月 -2015 21:3
2:31

Copyright (c) 1991, 2010, Oracle.  All rights reserved.

正在啟動 tnslsnr: 請稍候...

TNS-12560: TNS:協定介面程式錯誤
 TNS-00530: 協定轉接器錯誤


處理方案是重啟OracleOraDb11g_home1TNSListener

這個的位置在
[控制台]-[系統及安全性]-[系統管理工具]-[服務]

裡面找Oracle開頭,結尾是Listener的服務

將OracleOraDb11g_home1TNSListener停止後,重新啟動

如果你有將[啟動類型]改成[自動]的話,這樣以後開機就會自動啟動。


cmd指令:lsnrctl start

LSNRCTL for 64-bit Windows: Version 11.2.0.1.0 - Production on 02-3月 -2015 21:56:46

Copyright (c) 1991, 2010, Oracle.  All rights reserved.

TNS-01106: 已啟動名稱為 LISTENER 的監聽器





cmd指令:lsnrctl status

LSNRCTL for 64-bit Windows: Version 11.2.0.1.0 - Production on 02-3月 -2015 21:56:53

Copyright (c) 1991, 2010, Oracle.  All rights reserved.

連線至 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=你主機的IP)(PORT=1521)))
監聽器的狀態
------------------------
別名                     LISTENER
版本                     TNSLSNR for 64-bit Windows
啟動日期                 02-3月 -2015 21:56:40
正常運作時間          0 天 0 小時 0 分鐘 12 秒
追蹤層次                 off
安管                        ON: Local OS Authentication
SNMP                     OFF

監聽器參數檔案        
D:\app\user\product\11.2.0\dbhome_1\network\admin\listener.ora

監聽器日誌檔          
d:\app\user\product\11.2.0\dbhome_1\log\diag\tnslsnr\pcname\listener\alert\log.xml

監聽端點摘要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROCipc))
(PROTOCOL_STACK=(PRESENTATION=GIOP)(SESSION=RAW)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=主機的IP)(PORT=1521)))

服務摘要...

服務 "ORCL" 有 1 個執行處理.
  執行處理 "ORCL", 狀態 UNKNOWN, 有 1 個此服務的處理程式...

服務 "PLSExtProc" 有 1 個執行處理.
  執行處理 "PLSExtProc", 狀態 UNKNOWN, 有 1 個此服務的處理程式...

命令順利完成





2015年2月12日 星期四

java.lang.NoClassDefFoundError: net/sf/json/JSONArray



繼上次那篇

JBoss & RESTEasy





這篇可以幫你避免

java.lang.NoClassDefFoundError : net/sf/json/JSONArray

java.lang.NoClassDefFoundError: net/sf/json/JSONArray



在專案中使用 json-lib-2.4 來幫忙物件轉出 json

使用的到的是以下這些

\lib\commons-beanutils.jar
\lib\commons-collections.jar
\lib\commons-lang.jar
\lib\commons-logging.jar
\lib\ezmorph-1.0.6.jar
\lib\json-lib-2.4-jdk15.jar





加到Build Path之後
在WEB-INF資料夾中建立 lib 資料夾
然後把要用到的jar都丟進去lib

接著在pom.xml中加入

<dependency>
    <groupId>net.sf.json-lib</groupId>
    <artifactId>json-lib</artifactId>
    <version>2.4</version>
</dependency>

 這樣就可以開始用

import net.sf.json.JSONArray;




2015年2月8日 星期日

JBoss & RESTEasy



#這篇是翻譯文章,並且補充說明


RESTEasy Hello World Example


開發環境

  • Eclipse Kepler 
  • JBoss 6.x Runtime Server
  • RESTEasy 2.2.1.GA
  • jre7


Download Source Code
Download it – RESTEasy-Hello-World-Example.zip (7 KB)

當把檔案下載回來後


1. Import 進你的專案目錄

2. 找不到這些jar檔嗎?

M2_REPO/org/jboss/resteasy/resteasy-jaxrs/2.2.1.GA/resteasy-jaxrs-2.2.1.GA.jar
M2_REPO/org/jboss/resteasy/jaxrs-api/2.2.1.GA/jaxrs-api-2.2.1.GA.jar
M2_REPO/org/apache/httpcomponents/httpcore/4.0.1/httpcore-4.0.1.jar
M2_REPO/org/apache/httpcomponents/httpclient/4.0.3/httpclient-4.0.3.jar
M2_REPO/commons-codec/commons-codec/1.2/commons-codec-1.2.jar
M2_REPO/commons-httpclient/commons-httpclient/3.1/commons-httpclient-3.1.jar
M2_REPO/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar
M2_REPO/junit/junit/4.8.2/junit-4.8.2.jar


請至 RESTEasy  下載 RESTEasy 2.2.1.GA 

或到 sourceforge 下載 resteasy-jaxrs-2.2.1.GA-all.zip

然後重新修改你import的Libraries
  •  Java Build Path -> Libraries 
 
重新加入你下載回來的這些jar檔

  • resteasy-jaxrs-2.2.1.GA.jar
  • jaxrs-api-2.2.1.GA.jar
  • httpcore-4.0.1.jar
  • httpclient-4.0.3.jar
  • commons-codec-1.2.jar
  • commons-httpclient-3.1.jar
  • commons-logging-1.0.4.jar
junit-4.8.2.jar 用不到就不用加了


接著
  • Run AS-> Run as Server

選擇 
  • JBoss 6.x Runtime Server

確認你的JBoss work 之後

訪問

Test 1 : http://localhost:8080/RESTfulExample/rest/message/mkyong

Test 2 : http://localhost:8080/RESTfulExample/rest/message/hello%20world


Good Luck!

 



 

2015年2月7日 星期六

Class for Dynamic Logger using C# & log4net.



有時候Asp.net 、web service或寫 C# 會需要紀錄程式的log,

自己寫個文字檔當記錄也是可以,但是如果有現成的就不用自己刻。

這裡整理一下log4net的幾種用法,做為參考


本篇介紹Asp.net WebApplication 有IIS的case

如果你有先玩過log4net再來看這篇!!!





網路上教學很多都是需要在Global.asax 上啟用

這會遇到一個問題,如果IIS(機器)在人家手上,可不能給我上線每次說啟用就啟用

有時候軟重啟(ReStart)IIS 都要求人家幫你開,太痛苦了...

正在run 又要同時上新功能的也不可能讓你把IIS停下來

如果你所有的common log都是寫在同一個log file

你也不太可能在新上版的程式裡隨意的加上Shutdown

log.Logger.Repository.Shutdown();
然後每次呼叫方法時,都開開關關這樣,

這樣搞,共用log有可能被你關掉導致其他程式無法寫入


下面提供一個範例,Dyamic Logger動態的產生一個實體Logger

範例中的寫法不需要吃外部Xml config,

要吃也可以啦,看你要吃什麼設定檔什麼參數,

拉出去吃Web.config或自訂XML都可以。





using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using log4net;
using System.Reflection;
//using log4net.Config;
//using log4net.Repository.Hierarchy;
//using log4net.Appender;
//using log4net.Layout;
//using log4net.Core;

namespace WebApp_log4net
{

    public class HandlerforLog : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            Write("Application is starting");
            context.Response.ContentType = "text/plain";
            context.Response.Write("Hello World");
        }

        public void Write(String message)
        {
            ILog myLog = GetDyamicLogger();
            myLog.Info("[Write]:" + message);
        }

        public static ILog GetDyamicLogger()
        {
            log4net.Repository.Hierarchy.Hierarchy hierarchy = 
            (log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository();
            log4net.Appender.RollingFileAppender roller = 
              new log4net.Appender.RollingFileAppender();
            roller.LockingModel = new log4net.Appender.FileAppender.MinimalLock();
            roller.AppendToFile = true;
            roller.RollingStyle = 
               log4net.Appender.RollingFileAppender.RollingMode.Composite;
            roller.MaxSizeRollBackups = 29; // 0~29 is 30. 
            roller.MaximumFileSize = "10MB";
            roller.DatePattern = "yyyyMMdd";
            roller.Layout = new log4net.Layout.PatternLayout();
            roller.File = "log\\debug.log";
            roller.StaticLogFileName = true;

            log4net.Layout.PatternLayout patternLayout = 
                  new log4net.Layout.PatternLayout();
            patternLayout.ConversionPattern = 
             @"%date [%thread] %-5level %logger [%property{NDC}] - %message%newline";
            patternLayout.ActivateOptions();

            roller.Layout = patternLayout;
            roller.ActivateOptions();
            hierarchy.Root.AddAppender(roller);

            hierarchy.Root.Level = log4net.Core.Level.All;
            hierarchy.Configured = true;

            DummyLogger dummyILogger = new DummyLogger("LogName");
            dummyILogger.Hierarchy = hierarchy;
            dummyILogger.Level = log4net.Core.Level.All;
            dummyILogger.AddAppender(roller);

            return new log4net.Core.LogImpl(dummyILogger);
        }

        internal sealed class DummyLogger : log4net.Repository.Hierarchy.Logger
        {
            // Methods
            internal DummyLogger(string name)
                : base(name)
            {
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}




參考資料

http://amolgangawane.blogspot.tw/

http://www.howtosolvenow.com/2014/01/log4net-example-in-c-console-application/

http://www.curlette.com/?p=1113

http://interactivelogic.net/wp/2010/02/aspnet-logging-to-output-window-with-log4net/

http://weblogs.asp.net/stevewellens/log4net-log-to-a-javascript-console

http://www.howtosolvenow.com/2014/01/log4net-example-in-c-console-application/


2015年2月6日 星期五

抽獎不重複的小程式


抽獎不重複的小程式 (測試版載點)

功能:

  • 抽獎不重複,使用System.Guid.NewGuid沒有亂數表重複問題。
  • 抽獎的結果可以讓你可以key in 工號或姓名,這功能方便會計或總務作紀錄,直接複製可以貼Excel。
  • 尾牙可以用XD



步驟簡單:

  • 可以自由設定總人數
  • 抽獎有跑動態特效
  • 得獎名單可編輯與複製貼上文字








讓你可以key in 工號或姓名,這功能方便會計或總務作紀錄,直接複製可以貼Excel




 每次抽獎都是重新搖獎,Guid.NewGuid保證亂數隨機









如果你想要完整版本,或提新需求合作
請留言
3Q






2015年2月4日 星期三

RESTful Web Services with Java



#本篇是翻譯文學(X)

RESTful Web Services with Java



J2EE  RESTful的解決方案一大堆

這次將外國人的實作教學翻成中文

自己做一遍,順便當成紀錄這樣

如果你喜歡CCR...不是... 如果你喜歡外國人的文

請直接看原文 3Q





開發環境與使用素材

1. Eclipse Kepler 
2. C:\Program Files (x86)\Java\jre7
3. jersey jersey-archive-1.17.1  (RESTful Web Services in Java.)
4. Apache Tomcat 7.0.x





在Eclipse 新增[其他]專案



選擇 dynamic web project

接著命名為RESTfulWS

那個 選阿帕契的湯姆貓第七版 然後下一步下一步完成


專案開好後

把剛剛Jersey (傑西) 下載回來的壓縮檔打開  jersey-archive-1.17.1 

裡面長這樣




lib資料夾裡面

  • asm-3.1.jar
  • jersey-client-1.17.1.jar
  • jersey-core-1.17.1.jar
  • jersey-json-1.17.1.jar
  • jersey-server-1.17.1.jar
  • jersey-servlet-1.17.1.jar
  • jsr311-api-1.1.1.jar
把這些複製貼上到專案目錄中WEB-INF -> lib

專案目錄右鍵Propertise -> Java build Path 並且加入引用




請在專案目錄中建立web.xml

/RESTfulWS/WebContent/WEB-INF/web.xml






<?xml version="1.0" encoding="UTF-8"?>
<web-app
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee"
    id="WebApp_ID"
    version="2.5">
<display-name>RESTfulWS</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.eviac.blog.restws</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>


請在專案目錄中

建立
1.package com.eviac.blog.restclient
2.class UserInfoClient.java

/RESTfulWS/src/com/eviac/blog/restclient/UserInfoClient.java

程式碼如下



package com.eviac.blog.restclient;




import javax.ws.rs.core.MediaType;




import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;




/**
*&nbsp;
* @author pavithra
*&nbsp;
*/
public class UserInfoClient {




public static final String BASE_URI = "http://localhost:8080/RESTfulWS";
public static final String PATH_NAME = "/UserInfoService/name/";
public static final String PATH_AGE = "/UserInfoService/age/";




public static void main(String[] args) {




String name = "Pavithra";
int age = 25;




ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
WebResource resource = client.resource(BASE_URI);




WebResource nameResource = resource.path("rest").path(PATH_NAME + name);
System.out.println("Client Response \n"
+ getClientResponse(nameResource));
System.out.println("Response \n" + getResponse(nameResource) + "\n\n");




WebResource ageResource = resource.path("rest").path(PATH_AGE + age);
System.out.println("Client Response \n"
+ getClientResponse(ageResource));
System.out.println("Response \n" + getResponse(ageResource));
}




/**
* Returns client response.
* e.g :&nbsp;
* GET http://localhost:8080/RESTfulWS/rest/UserInfoService/name/Pavithra&nbsp;
* returned a response status of 200 OK
*
* @param service
* @return
*/
private static String getClientResponse(WebResource resource) {
return resource.accept(MediaType.TEXT_XML).get(ClientResponse.class)
.toString();
}




/**
* Returns the response as XML
* e.g : <User><Name>Pavithra</Name></User>&nbsp;
*&nbsp;
* @param service
* @return
*/
private static String getResponse(WebResource resource) {
return resource.accept(MediaType.TEXT_XML).get(String.class);
}
}


請在專案目錄中

建立
1.package com.eviac.blog.restws
2.class UserInfo.java

/RESTfulWS/src/com/eviac/blog/restws/UserInfo.java


程式碼如下





package com.eviac.blog.restws;




import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;




/**
*
* @author pavithra
*
*/




// @Path here defines class level path. Identifies the URI path that
// a resource class will serve requests for.
@Path("UserInfoService")
public class UserInfo {




// @GET here defines, this method will method will process HTTP GET
// requests.
@GET
// @Path here defines method level path. Identifies the URI path that a
// resource class method will serve requests for.
@Path("/name/{i}")
// @Produces here defines the media type(s) that the methods
// of a resource class can produce.
@Produces(MediaType.TEXT_XML)
// @PathParam injects the value of URI parameter that defined in @Path
// expression, into the method.
public String userName(@PathParam("i") String i) {




String name = i;
return "<User>" + "<Name>" + name + "</Name>" + "</User>";
}




@GET
@Path("/age/{j}")
@Produces(MediaType.TEXT_XML)
public String userAge(@PathParam("j") int j) {




int age = j;
return "<User>" + "<Age>" + age + "</Age>" + "</User>";
}
}



在專案上按右鍵 
     run as ->run on server.



按下Finish

別驚慌

http://localhost:8080/

不是你要去的地方

請訪問

http://localhost:8080/RESTfulWS/rest/UserInfoService/name/Pavithra



http://localhost:8080/RESTfulWS/rest/UserInfoService/age/25


age這最後面參數可以自己帶

http://localhost:8080/RESTfulWS/rest/UserInfoService/age/18




2015年1月20日 星期二

Eclipse debugging “source not found.” 找不到資源,短解



找不到資源,短解


Eclipse debugging “source not found”

Source not found.



1.Clicked on the "Breakpoints" window at the bottom of the debugging screen
   開啟Breakpoints視窗

2.Right clicked "NullPointerException"
   右鍵點選NullPointerException取消勾選選單中的Caught
   或是直接取消勾選下面的Caught locations

3.Unchecked "Caught locations"
   取消勾選下面的Caught locations

Source not found.




  

2015年1月15日 星期四

使用JCL與Log4j2紀錄log



使用 JCL 與 Log4j2 紀錄 log (教學)


使用 JCL 版本為

Apache Commons Logging 1.2




使用Log4j2 版本為

Apache Log4j 2






以Eclipse來舉例:

在你的Java Project 上開啟 Properties視窗
Properties -> Java Build Path -> Libraries -> Add External JARs..

加入以下 jar 檔
  • og4j-api-2.1.jar
  • log4j-core-2.1.jar

然後在路徑 src 內新增一個XML檔,檔名 log4j2.xml

如果需要設定log的檔案名稱

經由操控檔名
可以做到

File Name format by hour
filePattern="logs/log-%d{yyyyMMdd-HH}.log"
File Name format by minute
filePattern="logs/log-%d{yyyyMMdd-HHmm}.log"
File Name format by second
filePattern="logs/log-%d{yyyyMMdd-HHmmss}.log"
File Name format by millisecond 
filePattern="logs/log-%d{yyyyMMdd-HHmmss.SSS}.log"

如果單一檔案超過10MB,檔名的i++
filePattern="logs/log-%d{yyyyMMdd-HH}~%i.log"


設定檔範例 log4j2.xml




<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <!-- Console & SYSTEM_OUT format by pattern-->
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n" />
        </Console>
        <!-- DailyFile & Log file Name format by pattern-->
        <RollingFile
            name="DailyFile" fileName="logs/Teemo-log.log"
            filePattern="logs/log-%d{yyyyMMdd-HH}~%i.log">
            <PatternLayout>
                <Pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss} [%t] %c{1} - %msg%n
                </Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                <SizeBasedTriggeringPolicy size="10 MB" />
            </Policies>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Logger name="org.apache.log4j.xml" level="info" />
        <Root level="debug">
            <AppenderRef ref="Console" />
            <AppenderRef ref="DailyFile" />
        </Root>
    </Loggers>
</Configuration>




範例程式
package main;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class UsingLog4j2AndJCL {

 protected static Log log = LogFactory.getLog(UsingLog4j2AndJCL.class);
 
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  log.info("Hello, World!"); 
  log.error("Hello, World!");       
 }

}





相關資料可以參考

[JAVA][log4j] 詳細設定




熱門文章