PDA

View Full Version : سوال: نوشتن LOG در فایل txt



cemohsen
شنبه 02 شهریور 1387, 08:34 صبح
با سلام خدمت دوستان عزیزم
قرض از مزاحمت اینکه من می خوام برای یه سایت یه LOG کامل بنویسم تا هر گونه خطا یا کوچکترین تغییری که تو Dbase انجام می دم رو تو اون ثبت کنم
من این کار رو الان با ساخت یه جدول تو SQL server به راحتی انجام می دم
اما می خوام تمام Log هام رو توی فایل txt ذخیره کنم
و بتونم از اون بخونم و روش دستورات T-SQL بزنم و جستجو و ....


میشه کمکم کنید (لطفا کامل راهنمایی کنید)

hosseinab
شنبه 02 شهریور 1387, 11:08 صبح
دستورات T-SQL مال Sql هست و توي يك فايل تكست نميشه استفاده كرد شايد يه فايل XML يه كم از راحت باشه كه مي توني از LINQ هم استفاده كني . يه پيشنهاد ديگه هم اين كه از همون تيبل استفاده كن هر وقت فايل تكست خواستي از تيبل بخون بريز توي فايل

mehdi.mousavi
شنبه 02 شهریور 1387, 11:53 صبح
دستورات T-SQL مال Sql هست و توي يك فايل تكست نميشه استفاده كرد

سلام.
چرا، دستورات SQL رو میشه رو فایلهای Text هم اجرا کرد! Support کردن این مساله هم بستگی مستقیم به DB Provider اتون داره. بعنوان مثال Jet Driver ها این امکان رو به شما میدن.

البته، من منظور cemohsen رو متوجه نمیشم. وقتی اطلاعات در یک (یا چند) جدول وجود داره، چه نیازی به تبدیل اونها به فایل Text هست که مجددا بخوان روش دستورات SQL رو اجرا کنن؟

cemohsen
شنبه 02 شهریور 1387, 14:35 عصر
با سلام و تشکر از دوستان به خاطر پاسخ ها
فکر کنم باید یکمی بیشتر توضیح بدم
ببینید
من الان هر جایی از برنامه که به دستور SQL انجام می شه ، اون دستور و نام کاربرش و یه سری اطلاعات دیگه رو توی یه جدول ذخیره می کنم که می خوام به جای جدول از فایل txt استفاده کنم و چون نمی خوام از فضای گرانقیمت SQL برای ثبت LOG استفاده کنم و چند تا دلیل دیگه ...

پس اولین مشکل من ثبت اطلاعات توی فایل (بهتره txt باشه)

در ثانی من می خوام بتونم روی اون داده ها جستجو کنم برای اینکه مثلا بتونم فقط اعمال یه کاربر رو ببینم یا اعمل توی یک روز رو ببینم و .....


پس مشکل دوم اینه که LOG رو بخونم و بتونم روی اون جستجو کنم


من باید از NET 1.1 استفاده کنم ، پس نمی تونم با LINQ کار کنم

منتظر کمکتون هستم

mehdi.mousavi
شنبه 02 شهریور 1387, 15:11 عصر
با سلام و تشکر از دوستان به خاطر پاسخ ها
فکر کنم باید یکمی بیشتر توضیح بدم ببینید من الان هر جایی از برنامه که به دستور SQL انجام می شه ، اون دستور و نام کاربرش و یه سری اطلاعات دیگه رو توی یه جدول ذخیره می کنم که می خوام به جای جدول از فایل txt استفاده کنم و چون نمی خوام از فضای گرانقیمت SQL برای ثبت LOG استفاده کنم و چند تا دلیل دیگه ... پس اولین مشکل من ثبت اطلاعات توی فایل (بهتره txt باشه) در ثانی من می خوام بتونم روی اون داده ها جستجو کنم برای اینکه مثلا بتونم فقط اعمال یه کاربر رو ببینم یا اعمل توی یک روز رو ببینم و ..... پس مشکل دوم اینه که LOG رو بخونم و بتونم روی اون جستجو کنم من باید از NET 1.1 استفاده کنم ، پس نمی تونم با LINQ کار کنم
منتظر کمکتون هستم

سلام.
برای اینکار میتونید یه NT Service بنویسید. به این ترتیب که این سرویس همواره مترصد گرفتن یک (یا چند) دستور از Client هاست. (در این مورد Client میتونه SQL Server، DALC و ... باشه). به این ترتیب سرویس شما همواره میتونه بطور همزمان و همیشه درخواستها رو بپذیره و در صف درونی خودش قرار بده. این صف، که توسط Thread دیگه ای باید پردازش بشه، حاوی اطلاعاتی هستش که باید LOG بشن. وظیف این Thread چسبوندن (Append کردن) اطلاعات مورد نظر در پیام مزبور به فایل (یا فایلهای) log مورد نظر تحت فرمت مورد نیازتون هست. به این ترتیب، چون دستورات تک تک از صف برداشته شده و پردازش میشن، در واقع عملیات log کردن Serialize شده، و دیگه دو (یا چند Thread) همزمان برای بازکردن یک فایل Log اقدام نخواهند کرد. ضمن اینکه شما هم bottleneck ای برای SQL Server ایجاد نمیکنید.

پاورقی: اگر قرار بود اینکارو من انجام بدم، از MSMQ استفاده میکردم.

cemohsen
شنبه 02 شهریور 1387, 15:45 عصر
سلام.
برای اینکار میتونید یه NT Service بنویسید. به این ترتیب که این سرویس همواره مترصد گرفتن یک (یا چند) دستور از Client هاست. (در این مورد Client میتونه SQL Server، DALC و ... باشه). به این ترتیب سرویس شما همواره میتونه بطور همزمان و همیشه درخواستها رو بپذیره و در صف درونی خودش قرار بده. این صف، که توسط Thread دیگه ای باید پردازش بشه، حاوی اطلاعاتی هستش که باید LOG بشن. وظیف این Thread چسبوندن (Append کردن) اطلاعات مورد نظر در پیام مزبور به فایل (یا فایلهای) log مورد نظر تحت فرمت مورد نیازتون هست. به این ترتیب، چون دستورات تک تک از صف برداشته شده و پردازش میشن، در واقع عملیات log کردن Serialize شده، و دیگه دو (یا چند Thread) همزمان برای بازکردن یک فایل Log اقدام نخواهند کرد. ضمن اینکه شما هم bottleneck ای برای SQL Server ایجاد نمیکنید.

پاورقی: اگر قرار بود اینکارو من انجام بدم، از MSMQ استفاده میکردم.
با سلام و تشکر
دوست عزیز من احساس می کنم به طور تئوری فهمیدم که شما چی گفتین
اما به طور عملی اصلا نمی دونم که حالا با توجه به توضیخات شما باید چی کار کنم
و این چیزایی رو که گفتید من چطوری پیاده سازی کنم
اگه لطف کنید یه مثال ساده ، sample کوچولو برام بفرستید که من ببینم چطور باید اون اعمال رو انجام بدم یه دنیا ممنون می شم

با تشکر پیشاپیش

mehdi.mousavi
شنبه 02 شهریور 1387, 15:51 عصر
با سلام و تشکر
دوست عزیز من احساس می کنم به طور تئوری فهمیدم که شما چی گفتین اما به طور عملی اصلا نمی دونم که حالا با توجه به توضیخات شما باید چی کار کنم و این چیزایی رو که گفتید من چطوری پیاده سازی کنم اگه لطف کنید یه مثال ساده ، sample کوچولو برام بفرستید که من ببینم چطور باید اون اعمال رو انجام بدم یه دنیا ممنون می شم
با تشکر پیشاپیش

با عرض پوزش، من فرصت اینکارو ندارم.

cemohsen
دوشنبه 04 شهریور 1387, 11:19 صبح
با سلام خدمت شما دوست عزیز
از اینکه من رو با راهنمایی کردید و با مفهوم NT Service
آشنا کردید ، خیلی ممنونم

من کاری رو که برای حل این مشکل کردم اینجا می گم تا شما نظر بدید که این کار اصولی و مهندسی هست یا دنبال یه راه بهتر بگردم

من یه کلاس نوشتم که لوگ رو تو فایل متنی ثبت می کنه
و یه کلاس دیگه هم زدم که اون رو از کلاس می خونه و توی یه DataTable بر می گردونه و بعد هم اون رو به GridView خودم Bind
می کنم

و برای جستجو و تغییراتی که می خواستم هم اینکار رو کردم که من اول هر خط رو می خونم و اون رو بعد از Split کردن داخل یه لیست آرایه می ریزم
بعد شرع می کنم هر کدوم از عناصر این لیست رو که می خوام با مقادیری که به عنوان ورودی برای جستجو و ... اومدن مقایسه می کنم و اگه مقادیر مورد نیاز من بود یه متغیر پرچم دارم که اون رو فعال می کنم و در غیر این صورت اون رو غیر فعال می کنم

و اگه ثبات پرچم فعال بود اون عناصر رو به DataTable میریزم و می رم سراغ خط بعدی و ادامه ماجرا ....

بازم از همه دوستان ممنونم
شاد باشید

mp2009
چهارشنبه 06 شهریور 1387, 16:31 عصر
با سلام خدمت شما دوست عزیز
از اینکه من رو با راهنمایی کردید و با مفهوم NT Service
آشنا کردید ، خیلی ممنونم

من کاری رو که برای حل این مشکل کردم اینجا می گم تا شما نظر بدید که این کار اصولی و مهندسی هست یا دنبال یه راه بهتر بگردم

من یه کلاس نوشتم که لوگ رو تو فایل متنی ثبت می کنه
و یه کلاس دیگه هم زدم که اون رو از کلاس می خونه و توی یه DataTable بر می گردونه و بعد هم اون رو به GridView خودم Bind
می کنم

و برای جستجو و تغییراتی که می خواستم هم اینکار رو کردم که من اول هر خط رو می خونم و اون رو بعد از Split کردن داخل یه لیست آرایه می ریزم
بعد شرع می کنم هر کدوم از عناصر این لیست رو که می خوام با مقادیری که به عنوان ورودی برای جستجو و ... اومدن مقایسه می کنم و اگه مقادیر مورد نیاز من بود یه متغیر پرچم دارم که اون رو فعال می کنم و در غیر این صورت اون رو غیر فعال می کنم

و اگه ثبات پرچم فعال بود اون عناصر رو به DataTable میریزم و می رم سراغ خط بعدی و ادامه ماجرا ....

بازم از همه دوستان ممنونم
شاد باشید
میشه کلاسی که برای ذخیره txt نوشتید رو اینجا بزارید؟
مرسی

mehdi.mousavi
چهارشنبه 06 شهریور 1387, 23:18 عصر
با سلام خدمت شما دوست عزیز
از اینکه من رو با راهنمایی کردید و با مفهوم NT Service
آشنا کردید ، خیلی ممنونم

من یه کلاس نوشتم که لوگ رو تو فایل متنی ثبت می کنه و یه کلاس دیگه هم زدم که اون رو از کلاس می خونه و توی یه DataTable بر می گردونه و بعد هم اون رو به GridView خودم Bind می کنم و برای جستجو و تغییراتی که می خواستم هم اینکار رو کردم که من اول هر خط رو می خونم و اون رو بعد از Split کردن داخل یه لیست آرایه می ریزم بعد شرع می کنم هر کدوم از عناصر این لیست رو که می خوام با مقادیری که به عنوان ورودی برای جستجو و ... اومدن مقایسه می کنم و اگه مقادیر مورد نیاز من بود یه متغیر پرچم دارم که اون رو فعال می کنم و در غیر این صورت اون رو غیر فعال می کنم و اگه ثبات پرچم فعال بود اون عناصر رو به DataTable میریزم و می رم سراغ خط بعدی و ادامه ماجرا ....
بازم از همه دوستان ممنونم
شاد باشید

سلام.
اگر طبق چیزی که نوشتید، اطلاعات رو بصورت یه DataTable در آوردید، خوب دیگه از اینجا به بعد باید از XPATH QUERY ها استفاده کنید (برای Search) و هیچ روش دیگه ای قابل قبول نیست. البته من هنوزم شک دارم که درست متوجه شده باشم...

آیا اطلاعات Log File رو در DataTable ریختید؟ اگر اینطوره، روشی که گفتم رو باید استفاده کنید؛ یعنی XPath Query ها. در غیر اینصورت، دقیق توضیح بدید چیکار کردید تا پاسخ بدم.

cemohsen
پنج شنبه 21 شهریور 1387, 17:46 عصر
سلام
شرمنده که یکم دیر شد ، فکر نمی کردم کسی جواب بده

من از کد زیر برای ثبک کردن Log تو فایل استفاده کردم

public static void CreateLog(string Action,string Page,int ModuleID)
{
//get server path
string ServerPath=HttpContext.Current.Server.MapPath("../ViewLog/");

//Get User ID
string UID=HttpContext.Current.Session["UID"].ToString();


//Get Persian Date
string Today=MiladiToShamsi(DateTime.Now);



//Log File Name
string LogPath= ServerPath + "Log.txt";


//Create instance of StreamWrite to write log to file
StreamWriter sw= new StreamWriter(LogPath,true);


//Write log to file
string LogText=UID.Trim() + "," + Today + "," + Action.Trim() + "," + Page.Trim() + "," + ModuleID;
sw.WriteLine(LogText);

//Clear buffer and close File
sw.Flush();
sw.Close();

}

و از این کد هم برای خوندنش استفاده می کنم

public static DataTable GetLog(int UID,int MID,string LogDate)
{
//get server path
string ServerPath=HttpContext.Current.Server.MapPath("../ViewLog/Log.txt");


//Create instance of StreamReader to read log from file
StreamReader sr= new StreamReader(ServerPath);


//Define for each line
string line=string.Empty;

//Declare a variable for search
bool flag=true;


//Create DataTable by columns
DataTable MyTable = new DataTable("MyTable");

DataColumn Admin = new DataColumn("Admin");
Admin.DataType = System.Type.GetType("System.String");
Admin.MaxLength = 50;
Admin.AllowDBNull = false;

DataColumn Date = new DataColumn("Date");
Date.DataType = System.Type.GetType("System.String");
Admin.MaxLength = 50;
Date.AllowDBNull = false;


DataColumn Action = new DataColumn("Action");
Action.DataType = System.Type.GetType("System.String");
Action.MaxLength = 50;
Action.AllowDBNull = false;

DataColumn Page = new DataColumn("Page");
Page.DataType = System.Type.GetType("System.String");
Page.MaxLength = 50;
Page.AllowDBNull = false;

DataColumn Module = new DataColumn("Module");
Module.DataType = System.Type.GetType("System.String");
Admin.MaxLength = 50;
Module.AllowDBNull = false;

MyTable.Columns.Add("Admin");
MyTable.Columns.Add("Date");
MyTable.Columns.Add("Action");
MyTable.Columns.Add("Page");
MyTable.Columns.Add("Module");
MyTable.AcceptChanges();


// define which character is seperating fields
char[] splitter = {','};


//Reade log from file and split it
while ((line=sr.ReadLine()) != null)
{
//Split a line
string[] currentlog = new string[5];
currentlog=line.Split(splitter);

//Declare Row
DataRow MyDataRow = MyTable.NewRow();


//Convert admin and module ID to int for compare by input value
//And set flag
int AdminID=Convert.ToInt32(currentlog[0]);
int ModuleID=Convert.ToInt32(currentlog[4]);
string LDate= currentlog[1].Trim();



//if id(s) equal or all admin selected , flag true
if ((AdminID == UID) || (UID ==-1))
flag=true;
else
{
flag=false;
continue;
}

//if id(s) equal or all item selected , flag true
if((ModuleID==MID) || (MID ==0))
flag=true;
else
{
flag=false;
continue;
}

//if date(s) equal , flag true
if(String.Compare(LogDate.Trim(),LDate)==0)
flag=true;
else
flag=false;


//if falg is true , add data to DataTable
if(flag)
{
MyDataRow["Admin"]=GetAdminName(AdminID);
MyDataRow["Date"]=currentlog[1];
MyDataRow["Action"]=currentlog[2];
MyDataRow["Page"]=currentlog[3];
MyDataRow["Module"]=GetModuleName(ModuleID);
MyTable.Rows.Add(MyDataRow);
MyTable.AcceptChanges();
}

}


return MyTable;

}
همین طوری که می بینید تا وقتی که Flag یک نشه داده های هر سطر من (هر سطر تو فایلم) وارد DataTable نمی شه و این روش خیلی خوبی برای جستجو می مونه (البته هیچ روش دیگه ای مثل استفاده از Xml و ... بلد نیستم)
البته این رو هم بگم که وقتی با Copy&Paste داده های فایل Log رو زیاد می کنم ، ا خطایی مواجه می شم که مضمومش اینه که StreamReader نمی تونه داده ها رو بخونه

حالا چند تا سوال دارم
برای نوشته و خواندن فایل از چه روش دیگه استفاده کنم تا اگه فایل Log بزرگ شد مشکلی پیش نیاد ؟
من در مورد XPATH QUERY هیچی نمی دونم و خیلی دوست دارم که یاد بگیرم ، می شه بیشتر راهنما یی کنید منو (من تشته یادگیری هستم:لبخندساده:)

پیشاپیش تشکر می کنم
شاد و سرحال باشید