উইন্ডোজ অ্যাপ্লিকেশন ইভেন্ট লগ লিখুন


165

এই ইভেন্ট লগ লিখতে একটি উপায় আছে:

এখানে চিত্র বর্ণনা লিখুন

বা কমপক্ষে, অন্য কয়েকটি উইন্ডোজ ডিফল্ট লগ, যেখানে আমার কোনও ইভেন্ট উত্স নিবন্ধন করতে হবে না ?




1
"উত্সটির সাথে প্রথম এন্ট্রি লেখার আগে আপনাকে অবশ্যই ইভেন্ট উত্সটি তৈরি এবং কনফিগার করতে হবে।"
জেরেটার

মনে হচ্ছে আমি পারছি না সুতরাং, অ্যাপ্লিকেশনটি উইন্ডোজ লগগুলিতে লিখতে পারে না এমন সতর্ক করার জন্য কি কোনও ভাল ফ্যালব্যাক পদ্ধতি রয়েছে? একটি ফ্ল্যাট ফাইল ভাল মনে হয় কিন্তু, কোথায়? অ্যাপ্লিকেশন ফোল্ডারে এখনও কিছু অনুমতি লাগবে। আমার অ্যাপ্লিকেশনটি একটি উইন্ডোজ পরিষেবা।
জেরথের

3
যদি আপনার অ্যাপ্লিকেশনটি একটি উইন্ডোজ পরিষেবা হয় তবে আপনার জন্য স্বয়ংক্রিয়ভাবে একটি ইভেন্ট উত্স তৈরি করা হবে। আপনি এটি মাধ্যমে অ্যাক্সেস করতে পারেন ServiceBase.EventLog। উত্সটির ডিফল্ট নাম পরিষেবা নাম ame
মাইক Zboray

উত্তর:


237

হ্যাঁ, আপনি যে ইভেন্টটির সন্ধান করছেন তাতে লিখতে একটি উপায় রয়েছে। আপনার কোনও নতুন উত্স তৈরি করার দরকার নেই, কেবলমাত্র বিদ্যমান অস্তিত্বটি ব্যবহার করুন, যা প্রায়শই ইভেন্টলগের নাম হিসাবে একই নামে থাকে এবং ইভেন্ট লগ অ্যাপ্লিকেশন এর মতো কিছু ক্ষেত্রে প্রশাসনিক সুযোগ-সুবিধা ছাড়াই অ্যাক্সেসযোগ্য হতে পারে।

* অন্যান্য ক্ষেত্রে, যেখানে আপনি সরাসরি এটি অ্যাক্সেস করতে পারবেন না সেগুলি হ'ল সুরক্ষা ইভেন্টলগ, উদাহরণস্বরূপ, যা কেবলমাত্র অপারেটিং সিস্টেম দ্বারা অ্যাক্সেস করা যায়।

ইভেন্ট লগটিতে সরাসরি লিখতে আমি এই কোডটি ব্যবহার করেছি অ্যাপ্লিকেশন:

using (EventLog eventLog = new EventLog("Application")) 
{
    eventLog.Source = "Application"; 
    eventLog.WriteEntry("Log message example", EventLogEntryType.Information, 101, 1); 
}

আপনি দেখতে পাচ্ছেন, ইভেন্টলগ উত্স ইভেন্টলগের নামের মতো। এর কারণ ইভেন্ট উইন্ডোজ @ উইন্ডোজ ডেভ সেন্টারে পাওয়া যাবে (আমি সেই অংশটি উত্সাহিত করেছি যা উত্সের নাম উল্লেখ করে):

ইভেন্টলগ কীতে প্রতিটি লগে ইভেন্ট উত্স নামক সাবকি থাকে। ইভেন্টের উত্সটি সেই সফ্টওয়্যারটির নাম যা ইভেন্টটি লগ করে। এটি প্রায়শই অ্যাপ্লিকেশনটির নাম বা অ্যাপ্লিকেশনটির বড় উপকরণের নাম যদি অ্যাপ্লিকেশনটি বড় হয়। আপনি নিবন্ধে সর্বাধিক 16,384 ইভেন্টের উত্স যুক্ত করতে পারেন।


1
তবে আপনি যে পাঠ্যটি উদ্ধৃত করেছেন তা বলছে যে আপনাকে ইভেন্টের লোগোটিতে ইভেন্ট উত্সটি নিবন্ধিত করতে হবে।
রেমন্ড চেন 18

1
আমি যা বোঝাতে চেয়েছি তা হল ইভেন্ট লগের নামটি প্রায়শই একই নামের সাথে থাকে, তাই আপনি নতুন উত্স তৈরি না করেই ইভেন্টলগটিতে সরাসরি ইভেন্টলগ এন্ট্রি নিবন্ধন করতে পারেন। আমি আরও পড়া জন্য উদ্ধৃত পাঠ্য সাহসী।
cloud120

3
টেকনিক্যালি রেজিস্ট্রি কী তৈরি আইন করা হয় ঘটনা উৎস নিবন্ধনের। অ্যাপ্লিকেশন নামের পরে কীটির নামকরণ বিরোধগুলি এড়াতে একটি সম্মেলন। আপনার উত্তরটি মূলত এই উত্তরটির মতো
রেমন্ড চেন

7
আপনার সময়ের রেমন্ড চেনের জন্য ধন্যবাদ, আমরা এখানে এমন কিছু সমাধান করার বা পরামর্শ দেওয়ার চেষ্টা করছি যা অন্যকে সহায়তা করতে পারে। এই ক্ষেত্রে আমি বিশ্বাস করি যে আমি বিষয়টির প্রশ্নের উত্তর দিয়েছি: "এই ইভেন্টের লগটিতে লেখার কোনও উপায় আছে: বা কমপক্ষে, উইন্ডোজের অন্য কোনও ডিফল্ট লগ, যেখানে আমাকে ইভেন্টের উত্সটি নিবন্ধন করতে হবে না?" -> আমি উত্তর দিয়েছি: হ্যাঁ এটিই আপনার সাথে ভাগ করে নিলাম। আপনি যেমনটি বলেছেন যেহেতু এটি বিরোধের কারণ হতে পারে সত্ত্বেও, এটি একটি উপায় রয়েছে।
মেঘ120

7
আপনি এই প্রশ্নের উত্তর দিচ্ছেন "ইভেন্টের উত্সটি নিবন্ধন না করে এটি করার কোনও উপায় আছে কি?" এবং আপনার উত্তর বলে "ইভেন্ট উত্স রেজিস্টার করতে এই রেজিস্ট্রি কী তৈরি করুন।" এটি একটি বিদ্যমান উত্তরের সাথেও অভিন্ন।
রেমন্ড চেন

14

আপনি কীভাবে করবেন তার উপর বর্ণিত হিসাবে ইভেন্টলগ ক্লাসটি ব্যবহার করতে পারেন : অ্যাপ্লিকেশন ইভেন্ট লগটিতে লিখুন (ভিজ্যুয়াল সি #) :

var appLog = new EventLog("Application");
appLog.Source = "MySource";
appLog.WriteEntry("Test log message");

তবে আপনাকে প্রশাসনিক সুবিধাগুলি ব্যবহার করে এই উত্সটি "মাই সোর্স " কনফিগার করতে হবে :

ইভেন্ট লগে ইভেন্ট লিখতে WritEvent এবং WritEntry ব্যবহার করুন। ইভেন্টগুলি লিখতে আপনাকে অবশ্যই একটি ইভেন্ট উত্স নির্দিষ্ট করতে হবে; উত্সটির সাথে প্রথম এন্ট্রি লেখার আগে আপনাকে অবশ্যই ইভেন্ট উত্সটি তৈরি এবং কনফিগার করতে হবে।


2
আমার এই সমস্যাটি হ'ল: উত্সটি তৈরি করতে পারছি না কারণ আমার এই সুবিধাগুলি নেই, তবে আমার এখনও সেই সমস্যাটি কোথাও লগ ইন করতে হবে
জেরেরে

2
তারপরে একটি ইনস্টলার ( স্ট্যাকওভারফ্লো / সাকশনগুলি / 1484605/… ) ব্যবহার করুন বা ফাইলটিতে লগ করুন।
কোডকাস্টার

1
ধন্যবাদ. এই অন্য তাই প্রশ্ন এই নেতৃত্ব আমিঃ stackoverflow.com/questions/3930529/...
Jerther

@ কোডকাস্টার - কোথা থেকে আমরা এই লগগুলিতে অ্যাক্সেস করতে পারি? আমি যেখানে এটি সংরক্ষণ করা হয় মানে?
অরবিন্দ চৌরাসিয়া

1
@ উত্তরটি উত্তর দিন আমার প্রশ্নের উত্তরটির সাথে কোনও সম্পর্ক নেই এবং এটি সম্পূর্ণ নতুন প্রশ্ন।
কোডকাস্টার

11

এমএসডিএন (যেমন। Https://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog(v=vs.110).aspx ) এ যেমন বলা হয়েছে , কোনও বিদ্যমান উত্স চেক করা এবং উত্স তৈরি করতে প্রশাসকের প্রয়োজন বিশেষাধিকার।

তবে "অ্যাপ্লিকেশন" উত্সটি ছাড়াই ব্যবহার করা সম্ভব । উইন্ডোজ 2012 সার্ভার আর 2 এর অধীনে আমার পরীক্ষায় আমি "অ্যাপ্লিকেশন" উত্সটি ব্যবহার করে নিম্নলিখিত লগ এন্ট্রি পেয়েছি:

উত্স অ্যাপ্লিকেশন থেকে ইভেন্ট আইডি xxxx এর বর্ণনা পাওয়া যাবে না। হয় এই উপাদানটি উত্থাপনকারী উপাদানগুলি আপনার স্থানীয় কম্পিউটারে ইনস্টল করা নেই বা ইনস্টলেশনটি দূষিত। আপনি স্থানীয় কম্পিউটারে উপাদানটি ইনস্টল বা মেরামত করতে পারেন। ইভেন্টটি অন্য কম্পিউটারে উত্পন্ন হলে, প্রদর্শন তথ্য ইভেন্ট সহ সংরক্ষণ করতে হয়েছিল। ইভেন্টটির সাথে নিম্নলিখিত তথ্য অন্তর্ভুক্ত করা হয়েছিল: event আমার ইভেন্ট এন্ট্রি বার্তা} বার্তা সংস্থান উপস্থিত রয়েছে তবে বার্তাটি স্ট্রিং / বার্তা সারণীতে পাওয়া যায় নি

উত্স তৈরি করতে আমি নিম্নলিখিত পদ্ধতিটি সংজ্ঞায়িত করেছি:

    private string CreateEventSource(string currentAppName)
    {
        string eventSource = currentAppName;
        bool sourceExists;
        try
        {
            // searching the source throws a security exception ONLY if not exists!
            sourceExists = EventLog.SourceExists(eventSource);
            if (!sourceExists)
            {   // no exception until yet means the user as admin privilege
                EventLog.CreateEventSource(eventSource, "Application");
            }
        }
        catch (SecurityException)
        {
            eventSource = "Application";
        }

        return eventSource;
    }

আমি এটিকে কারেন্ট অ্যাপনাম = অ্যাপডোমেন.ক্রেনডোডমাইন.ফ্রেন্ডলি নাম দিয়ে কল করছি

এই চেষ্টা / ধরনের পরিবর্তে ইভেন্টলগপার্মিশন ক্লাসটি ব্যবহার করা সম্ভব হতে পারে তবে নিশ্চিত না যে আমরা ক্যাচটি এড়াতে পারি।

বাহ্যিকভাবে উত্স তৈরি করাও সম্ভব, যেমন এলিভেটেড পাওয়ারশেল:

New-EventLog -LogName Application -Source MyApp

তারপরে, উপরের পদ্ধতিতে 'মাই অ্যাপ' ব্যবহার করা ব্যতিক্রম তৈরি করবে না এবং ইভেন্ট উত্সটি সেই উত্স দিয়ে তৈরি করা যাবে।


10

এটি আমি ব্যবহার করা লগার শ্রেণি। ব্যক্তিগত লগ () পদ্ধতিতে এটি EventLog.WriteEntry()রয়েছে, যা আপনি আসলে ইভেন্ট লগতে এভাবে লিখেন। আমি এই কোডটি এখানে যুক্ত করছি কারণ এটি কার্যকর। লগিংয়ের পাশাপাশি, এই শ্রেণিটি নিশ্চিত করবে যে ইভেন্ট লগটিতে বার্তাটি লেখার জন্য খুব দীর্ঘ নয় (এটি বার্তাটি কেটে ফেলবে)। যদি বার্তাটি দীর্ঘ হয় তবে আপনি একটি ব্যতিক্রম পাবেন। কলার উত্সটিও নির্দিষ্ট করতে পারে। যদি কলার না করে তবে এই শ্রেণিটি উত্সটি পাবে। আশা করি এটা সাহায্য করবে.

উপায় দ্বারা, আপনি ওয়েব থেকে একটি অবজেক্টডাম্পার পেতে পারেন। আমি এখানে সব পোস্ট করতে চান না। আমি এখান থেকে আমার পেয়েছি:C:\Program Files (x86)\Microsoft Visual Studio 10.0\Samples\1033\CSharpSamples.zip\LinqSamples\ObjectDumper

using System;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Linq;
using System.Reflection;
using Xanico.Core.Utilities;

namespace Xanico.Core
{
    /// <summary>
    /// Logging operations
    /// </summary>
    public static class Logger
    {
        // Note: The actual limit is higher than this, but different Microsoft operating systems actually have
        //       different limits. So just use 30,000 to be safe.
        private const int MaxEventLogEntryLength = 30000;

        /// <summary>
        /// Gets or sets the source/caller. When logging, this logger class will attempt to get the
        /// name of the executing/entry assembly and use that as the source when writing to a log.
        /// In some cases, this class can't get the name of the executing assembly. This only seems
        /// to happen though when the caller is in a separate domain created by its caller. So,
        /// unless you're in that situation, there is no reason to set this. However, if there is
        /// any reason that the source isn't being correctly logged, just set it here when your
        /// process starts.
        /// </summary>
        public static string Source { get; set; }

        /// <summary>
        /// Logs the message, but only if debug logging is true.
        /// </summary>
        /// <param name="message">The message.</param>
        /// <param name="debugLoggingEnabled">if set to <c>true</c> [debug logging enabled].</param>
        /// <param name="source">The name of the app/process calling the logging method. If not provided,
        /// an attempt will be made to get the name of the calling process.</param>
        public static void LogDebug(string message, bool debugLoggingEnabled, string source = "")
        {
            if (debugLoggingEnabled == false) { return; }

            Log(message, EventLogEntryType.Information, source);
        }

        /// <summary>
        /// Logs the information.
        /// </summary>
        /// <param name="message">The message.</param>
        /// <param name="source">The name of the app/process calling the logging method. If not provided,
        /// an attempt will be made to get the name of the calling process.</param>
        public static void LogInformation(string message, string source = "")
        {
            Log(message, EventLogEntryType.Information, source);
        }

        /// <summary>
        /// Logs the warning.
        /// </summary>
        /// <param name="message">The message.</param>
        /// <param name="source">The name of the app/process calling the logging method. If not provided,
        /// an attempt will be made to get the name of the calling process.</param>
        public static void LogWarning(string message, string source = "")
        {
            Log(message, EventLogEntryType.Warning, source);
        }

        /// <summary>
        /// Logs the exception.
        /// </summary>
        /// <param name="ex">The ex.</param>
        /// <param name="source">The name of the app/process calling the logging method. If not provided,
        /// an attempt will be made to get the name of the calling process.</param>
        public static void LogException(Exception ex, string source = "")
        {
            if (ex == null) { throw new ArgumentNullException("ex"); }

            if (Environment.UserInteractive)
            {
                Console.WriteLine(ex.ToString());
            }

            Log(ex.ToString(), EventLogEntryType.Error, source);
        }

        /// <summary>
        /// Recursively gets the properties and values of an object and dumps that to the log.
        /// </summary>
        /// <param name="theObject">The object to log</param>
        [SuppressMessage("Microsoft.Globalization", "CA1303:Do not pass literals as localized parameters", MessageId = "Xanico.Core.Logger.Log(System.String,System.Diagnostics.EventLogEntryType,System.String)")]
        [SuppressMessage("Microsoft.Naming", "CA1720:IdentifiersShouldNotContainTypeNames", MessageId = "object")]
        public static void LogObjectDump(object theObject, string objectName, string source = "")
        {
            const int objectDepth = 5;
            string objectDump = ObjectDumper.GetObjectDump(theObject, objectDepth);

            string prefix = string.Format(CultureInfo.CurrentCulture,
                                          "{0} object dump:{1}",
                                          objectName,
                                          Environment.NewLine);

            Log(prefix + objectDump, EventLogEntryType.Warning, source);
        }

        private static void Log(string message, EventLogEntryType entryType, string source)
        {
            // Note: I got an error that the security log was inaccessible. To get around it, I ran the app as administrator
            //       just once, then I could run it from within VS.

            if (string.IsNullOrWhiteSpace(source))
            {
                source = GetSource();
            }

            string possiblyTruncatedMessage = EnsureLogMessageLimit(message);
            EventLog.WriteEntry(source, possiblyTruncatedMessage, entryType);

            // If we're running a console app, also write the message to the console window.
            if (Environment.UserInteractive)
            {
                Console.WriteLine(message);
            }
        }

        private static string GetSource()
        {
            // If the caller has explicitly set a source value, just use it.
            if (!string.IsNullOrWhiteSpace(Source)) { return Source; }

            try
            {
                var assembly = Assembly.GetEntryAssembly();

                // GetEntryAssembly() can return null when called in the context of a unit test project.
                // That can also happen when called from an app hosted in IIS, or even a windows service.

                if (assembly == null)
                {
                    assembly = Assembly.GetExecutingAssembly();
                }


                if (assembly == null)
                {
                    // From http://stackoverflow.com/a/14165787/279516:
                    assembly = new StackTrace().GetFrames().Last().GetMethod().Module.Assembly;
                }

                if (assembly == null) { return "Unknown"; }

                return assembly.GetName().Name;
            }
            catch
            {
                return "Unknown";
            }
        }

        // Ensures that the log message entry text length does not exceed the event log viewer maximum length of 32766 characters.
        private static string EnsureLogMessageLimit(string logMessage)
        {
            if (logMessage.Length > MaxEventLogEntryLength)
            {
                string truncateWarningText = string.Format(CultureInfo.CurrentCulture, "... | Log Message Truncated [ Limit: {0} ]", MaxEventLogEntryLength);

                // Set the message to the max minus enough room to add the truncate warning.
                logMessage = logMessage.Substring(0, MaxEventLogEntryLength - truncateWarningText.Length);

                logMessage = string.Format(CultureInfo.CurrentCulture, "{0}{1}", logMessage, truncateWarningText);
            }

            return logMessage;
        }
    }
}

3
এবং এই কোড যে দেখায়। তার সাথে এই ভাগ করে নিতে ক্ষতি কি? এটি ওপি এবং অন্যদের পক্ষে সহায়ক হতে পারে না?
বব হর্ন

5
ইভেন্টের উত্স তৈরি না করে আপনি ইভেন্ট লগে লিখতে পারবেন না , সুতরাং এই কোডটি এটি দেখায় না।
কোডকাস্টার

2
আমার এখনও ইভেন্ট উত্স তৈরি করতে হবে তবে প্রশ্নের শিরোনাম আপডেট হওয়ার আগে আপনি আপনার অ্যাঞ্জার পোস্ট করেছেন। তবুও, আমি দৈর্ঘ্যের সীমা ধন্যবাদ সম্পর্কে জানতাম না।
জেরথের

-4

চেষ্টা

   System.Diagnostics.EventLog appLog = new System.Diagnostics.EventLog();
   appLog.Source = "This Application's Name";
   appLog.WriteEntry("An entry to the Application event log.");

3
এটির জন্য একটি ইভেন্ট উত্স নিবন্ধন করা প্রয়োজন এবং এইভাবে প্রশ্নের উত্তর দেয় না। দুঃখিত।
জেরেরে

এই অ্যাপ্লিকেশনটির উত্সটি ব্যবহার করা এই প্রশ্নের মূল ধারণা।
rcarrillopadron
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.