log4net和nlog應該是一般工程師比較常使用的log機制,這兩個log套件雖然類似,但各自有各自的優點,如何讓它們能夠輕鬆的轉換呢?那就要使用Common.Logging
Common Logging是一個Log的介面,支援log4net、nlog、enterprise library logging...等,可透過log設定的方式,輕鬆的轉換不同的log機制,詳細請看請點我
設定方式也十分簡單,首先打開NuGet
1. 先安裝Common.Logging
今天小艾打算要配合NLog來使用
2.安裝Common.Logging.NLogXX (XX是版本號)
加入NLog的,為了方便使用
3.安裝NLog.Configuration
安裝完後就會自動產生NLog.config檔了,接下來只要設定好config就完成囉
4.在web.config的<configuration></configuration>裡加入
<configSections>
<sectionGroup name="common">
<section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
</sectionGroup>
</configSections>
<common>
<logging>
<factoryAdapter type="Common.Logging.NLog.NLogLoggerFactoryAdapter, Common.Logging.NLog31">
<arg key="configType" value="FILE" />
<arg key="configFile" value="~/NLog.config" />
</factoryAdapter>
</logging>
</common>
其中的Common.Logging.NLog31的31記得要改成第2步驟安裝的版號,這樣web.config的設定就完成了,接下來只要設定好NLog.config就大功告成了
5. 設定NLog.config
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!--
See https://github.com/nlog/nlog/wiki/Configuration-file
for information on customizing logging rules and outputs.
-->
<targets>
<target xsi:type="File" name="debug"
fileName="${basedir}/logs/debug/logfile.log"
layout="${longdate} ${uppercase:${level}} ${message}"
archiveEvery="Day"
archiveNumbering="Date"
maxArchiveFiles="30"
keepFileOpen="false"
archiveFileName="${basedir}/logs/debug/log.{#}.txt" />
<target xsi:type="File" name="info"
fileName="${basedir}/logs/info/logfile.log"
layout="${longdate} ${uppercase:${level}} ${message}"
archiveEvery="Day"
archiveNumbering="Date"
maxArchiveFiles="30"
keepFileOpen="false"
archiveFileName="${basedir}/logs/info/log.{#}.txt" />
<target xsi:type="File" name="error"
fileName="${basedir}/logs/error/logfile.log"
layout="${longdate} - ${onexception:inner=${exception:format=ToString}${newline}}"
archiveEvery="Day"
archiveNumbering="Date"
maxArchiveFiles="30"
keepFileOpen="false"
archiveFileName="${basedir}/logs/error/log.{#}.txt" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="debug" />
<logger name="*" level="Info" writeTo="info" />
<logger name="*" level="Error" writeTo="error" />
</rules>
</nlog>
target裡的詳細設定
fileName:設定log要放的位置
layout:log寫入的格式
archiveEvery="Day" : 每天產生一個log檔
archiveNumbering="Date" : 檔名的產生方式 {#} 就會以日期來替換
maxArchiveFiles="30" : 只保存30個檔案
archiveFileName : 自動產生出來檔案的檔名,照這裡的設定,當天的log檔名是logfile.log
前一天的是log.日期.txt,以此類推
rules裡的詳細設定
minlevel :只定要記到哪個層級的log,在nlog裡共有Trace, Debug, Info, Warn, Error, Fatal這幾個層級
witeTo :對應到target裡的name,設定記錄要記到哪個檔案
6.以上的設定就全部完成了,接下來只要在code裡寫上log就會成功將log寫進file裡了
private static readonly ILog Log = LogManager.GetCurrentClassLogger();
Log.Info("Application Start");
這樣就會在Info寫進Appliction Start的訊息了,只要把Info改成Debug, Error...就能夠偵對Log分層了,相當簡單實用,log寫的好,debug也會輕鬆許多~~
關於NLog的一些設定,可以參考這裡請點我
2015年1月8日 星期四
2015年1月2日 星期五
jQuery UI Sortable 拖曳更改順序並記錄
jQuery UI有個很好用的功能,可以使用拖曳的方式,直接調整畫面的順序,請見jQuery UI官網 jqueryui.com
但拖曳完後,要怎麼把排列順序存入後端呢?
資料庫設計了CategoryId、CategoryName、CategoryOrder三個欄位(CategoryOrder記錄順序)
首先先處理html的部份
1. 先加入jvavscript (因為套bootstrap畫面較好看,所以順便加入)
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/jquery-ui-1.11.2.min.js"></script>
<script src="~/Scripts/bootstrap.min.js"></script>
2. 加入css (可省略,只是為了加入bootstrap畫面較好看)
<link href="~/Content/bootstrap.min.css" rel="stylesheet" type="text/css" />
3. 設計表格,Sortable 也可支援<ul></ul>不一定要使用table
4.套入jQuery UI Sortable效果,在update裡使用$(this).sortable('toArray').toString();將表格裡的<tr id="@Html.DisplayFor(modelItem => item.CategoryOrder)">串成字串,但此方法只能將id轉成字串,較好的方法應該是取td裡的CategoryOrder欄位,但sortable好像沒辦法直接取到,可能要用jquery想辦法去取…就沒有做測試了
最後將組好的字串傳到後端處理,存進資料庫就大功告成囉~~
另外,因為沒有使用Angular或Knockout來做Data binding,而且傳到後端的是取tr的id…所以每次必需Reload畫面,讓id更新才行,較好的方法應該是使用Data binding,讓畫面上的CategoryOrder會即時更改,並取出傳至後端,就不需要每次重load了。
更新jQuery UI Sortable取得oldIndex和newIndex的方法,只需要傳兩個值到後端,就能夠偵對order進行排序,無需傳入一整個list囉。
1. start,當拖曳動作開始,就會先執行這一段,這使用ui.item.index(),就可以取得目前使用者拖曳的item的index,在用ui.item.data('start_pos', start_pos),把index填進此item的'start_pos'(這個名字可以自訂),tag中,產生出來的html會變成 <tr start_pos = "index"></tr>
2. 在update時,就可以使用ui.item.data('start_pos'),將剛才存下來的index取出來,在使用ui.item.context.rowIndex取得最新的index,將這兩個index傳到後端就大空告成了!!
3. 順便附上後端的c# code供大家參考
比上次的方法容易且合理多了,如果grid有設定分頁的話,別忘了把page和pagesize也傳到後端進行判斷囉!!
但拖曳完後,要怎麼把排列順序存入後端呢?
資料庫設計了CategoryId、CategoryName、CategoryOrder三個欄位(CategoryOrder記錄順序)
首先先處理html的部份
1. 先加入jvavscript (因為套bootstrap畫面較好看,所以順便加入)
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/jquery-ui-1.11.2.min.js"></script>
<script src="~/Scripts/bootstrap.min.js"></script>
2. 加入css (可省略,只是為了加入bootstrap畫面較好看)
<link href="~/Content/bootstrap.min.css" rel="stylesheet" type="text/css" />
3. 設計表格,Sortable 也可支援<ul></ul>不一定要使用table
<table id="mytable" class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.CategoryName)
</th>
<th>
@Html.DisplayNameFor(model => model.CategoryOrder)
</th>
<th></th>
</tr>
<tbody id="myfruit">
@foreach (var item in Model.OrderBy(r => r.CategoryOrder))
{
<tr id="@Html.DisplayFor(modelItem => item.CategoryOrder)">
<td>
@Html.DisplayFor(modelItem => item.CategoryName)
</td>
<td>
@Html.DisplayFor(modelItem => item.CategoryOrder)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id = item.CategoryId }) |
@Html.ActionLink("Details", "Details", new { id = item.CategoryId }) |
@Html.ActionLink("Delete", "Delete", new { id = item.CategoryId })
</td>
</tr>
}
</tbody>
</table>
4.套入jQuery UI Sortable效果,在update裡使用$(this).sortable('toArray').toString();將表格裡的<tr id="@Html.DisplayFor(modelItem => item.CategoryOrder)">串成字串,但此方法只能將id轉成字串,較好的方法應該是取td裡的CategoryOrder欄位,但sortable好像沒辦法直接取到,可能要用jquery想辦法去取…就沒有做測試了
最後將組好的字串傳到後端處理,存進資料庫就大功告成囉~~
另外,因為沒有使用Angular或Knockout來做Data binding,而且傳到後端的是取tr的id…所以每次必需Reload畫面,讓id更新才行,較好的方法應該是使用Data binding,讓畫面上的CategoryOrder會即時更改,並取出傳至後端,就不需要每次重load了。
$(function () {
$('#mytable tbody').sortable({
opacity: 0.6,
cursor: 'move',
axis: 'y',
update: function (event, ui) {
var productOrder = $(this).sortable('toArray').toString();
$.ajax({
type: 'post',
url: '/Home/DragItem',
data: {
orders: productOrder
},
success: function (result) {
window.location.href = result.redirectToUrl;
}
});
}
});
});
-------------------------2015.01.17更新------------------------------------------------更新jQuery UI Sortable取得oldIndex和newIndex的方法,只需要傳兩個值到後端,就能夠偵對order進行排序,無需傳入一整個list囉。
$('#grid tbody').sortable({
opacity: 0.6,
cursor: 'move',
axis: 'y',
start: function (event, ui) {
var start_pos = ui.item.index();
ui.item.data('start_pos', start_pos);
},
update: function (event, ui) {
//var productOrder = $(this).sortable('toArray').toString();
var oldIndex = ui.item.data('start_pos');
var newIndex = ui.item.context.rowIndex;
$.ajax({
type: 'post',
url: '/PeopleGroups/DropOrderItem',
data: {
oldIndex: oldIndex + 1,
newIndex: newIndex + 1,
page: currPage,
pageSize: pageSize
}
});
}
});
1. start,當拖曳動作開始,就會先執行這一段,這使用ui.item.index(),就可以取得目前使用者拖曳的item的index,在用ui.item.data('start_pos', start_pos),把index填進此item的'start_pos'(這個名字可以自訂),tag中,產生出來的html會變成 <tr start_pos = "index"></tr>
2. 在update時,就可以使用ui.item.data('start_pos'),將剛才存下來的index取出來,在使用ui.item.context.rowIndex取得最新的index,將這兩個index傳到後端就大空告成了!!
3. 順便附上後端的c# code供大家參考
if (oldIndex < newIndex)
{
var currGroup = ESHCloudsContext.PeopleGroups.SingleOrDefault(r => r.GroupOrder == oldIndex);
if (currGroup == null)
return false;
var peopleGroupList = ESHCloudsContext.PeopleGroups
.Where(r =>
r.GroupOrder <= newIndex &&
r.GroupOrder > oldIndex &&
r.GroupID != currGroup.GroupID
).ToList();
foreach (var peopleGroup in peopleGroupList)
peopleGroup.GroupOrder--;
currGroup.GroupOrder = newIndex;
ESHCloudsContext.SaveChanges();
}
else
{
var currGroup = ESHCloudsContext.PeopleGroups.SingleOrDefault(r => r.GroupOrder == oldIndex);
if (currGroup == null)
return false;
var peopleGroupList = ESHCloudsContext.PeopleGroups
.Where(r =>
r.GroupOrder < oldIndex &&
r.GroupOrder >= newIndex &&
r.GroupID != currGroup.GroupID
).ToList();
foreach (var peopleGroup in peopleGroupList)
peopleGroup.GroupOrder++;
currGroup.GroupOrder = newIndex;
ESHCloudsContext.SaveChanges();
}
比上次的方法容易且合理多了,如果grid有設定分頁的話,別忘了把page和pagesize也傳到後端進行判斷囉!!
最後推薦個新創日本求職網站
Trails會慢慢的提供一些有用的資訊給想到日本去工作的朋友,只要簡單的註冊會員後就可以免費看文章,找工作囉~~目前日本企業職缺正在募集中,會陸陸續續更新上來!
訂閱:
文章 (Atom)
[泰國] 芭達雅大城八日遊 Day7、8 - 瑪哈泰寺、Wat Ratchaburana、帕蒙空博碧寺、帕席桑碧寺、Hua Ro market、Chantharakasem National Museum、Amporn Department Store
第七天行程,早上吃飯店早餐,算不錯吃,只是有螞蟻,但吃完沒拉,所以應該還好 吃飽後飽嘟嘟車,一小時 200 泰銖,比自己叫還便宜,終於要來世界遺產之旅了 第一站:瑪哈泰寺,應該是大城最有名的景點了,入門票大人 120 ,小孩免費,其實不便宜 大城指標性景點...
-
遣入日本國境,深入了解日本主婦?日本主婦的一天,今天小艾要帶大家去看日本傳統家庭主婦的一天 ~~( 謎:為什麼不是日本正妹的一天或是日本高校生的一天呢?謎 2 :我就是喜歡介紹大家不介紹的 ~~) 首先呢,大約每天凌晨的三、四點,送報員就會送上報紙與一大疊的廣告傳單 ...
-
一、 貸款、房價 因為來到了日本工作,發現日本租屋實在貴的可以,買比租還要便宜,只是需要注意的是 ” 日本的房子賣掉基本上一定是賠錢 ” ,不會像台灣這樣可以抄房賺錢,所以購買錢要先想清楚這間房子要怎麼處理,是租人呢?或是賣掉,不同的決定,要選擇的房子也不同囉。 ...
-
沒錯,大阪…我又來了,這次是小艾我第三次到大阪了,這一次就要把之前沒去過的地方一次補完 ~~ 第一個瞬間馬上就想到了《 祭り 》,來了大阪這麼多趟竟然還沒有體驗過日本的祭典文化,剛好這次的時間趕上了具有 1000 多年歷史的天神祭號稱是《日本三大節慶活動》之一,聽起來夠厲害...