গোলংয়ে বিশ্বব্যাপী লগিংয়ের সঠিক পদ্ধতির


118

Go এপ্লিকেশন লগিংয়ের প্যাটার্নটি কী? যদি আমি পেয়ে থাকি, বলুন, আমার যে 5 গরোটিনগুলি থেকে লগ ইন করা উচিত, আমি কি ...

  • একটি একক তৈরি log.Loggerএবং এটি পাস?
  • একটি পয়েন্টার কাছাকাছি যে পাস log.Logger?
  • প্রতিটি গোরোটিন বা ফাংশন লগার তৈরি করা উচিত?
  • আমি কি বিশ্বব্যাপী পরিবর্তনশীল হিসাবে লগার তৈরি করব?

উত্তর:


59
  • একটি একক লগ তৈরি করুন og

এটা সম্ভব। একজন log.Logger একাধিক goroutines থেকে একই সময়ে ব্যবহার করা যাবে।

  • সেই লগের কাছে পয়েন্টারের চারপাশে পাস? লগার?

লগ.নতুন একটি প্রত্যাবর্তন করে *Loggerযা সাধারণত একটি ইঙ্গিত দেয় যে আপনাকে পয়েন্টার হিসাবে চারপাশে বস্তুটি পাস করা উচিত। মান হিসাবে এটি পাসওয়ার্ডের অনুলিপি তৈরি করতে পারে (অর্থাত্ লোগারের একটি অনুলিপি) এবং তারপরে একাধিক গোরোটাইন একই আইও.রাইটারে একই সাথে লিখতে পারে । লেখকের বাস্তবায়নের উপর নির্ভর করে এটি একটি গুরুতর সমস্যা হতে পারে।

  • প্রতিটি গোরোটিন বা ফাংশন লগার তৈরি করা উচিত?

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

  • আমি কি বিশ্বব্যাপী পরিবর্তনশীল হিসাবে লগার তৈরি করব?

এটি আপনার প্যাকেজের উপর নির্ভর করে। পূর্ববর্তী মেল পরিষেবা উদাহরণে, আপনার পরিষেবার প্রতিটি উদাহরণের জন্য একটি লগার রাখা সম্ভবত একটি ভাল ধারণা হবে, যাতে স্থানীয় এমটিএ ব্যবহার করার সময় ঘটে যাওয়া ব্যর্থতার চেয়ে জিমেইল মেল পরিষেবাটি ব্যবহার করার সময় ব্যবহারকারীরা ব্যর্থতা লগ করতে পারে (যেমন: সেন্ডমেইল )।


37

সাধারণ ক্ষেত্রে লগ প্যাকেজে সংজ্ঞায়িত একটি গ্লোবাল লগার রয়েছে log.Logger। এই গ্লোবাল লগার মাধ্যমে কনফিগার করা যেতে পারে log.SetFlags

এরপরে কেউ কেবল লগ প্যাকেজের শীর্ষ স্তরের ফাংশনগুলিকে কল করতে পারে log.Printfএবং log.Fatalfএটি বিশ্বব্যাপী উদাহরণ ব্যবহার করে।


ভেবেছি আপনি পতাকাগুলি সেট করতে পারেন আপনি কাস্টম লগার ব্যবহার করতে পারবেন না।
0xcaff

@ ক্যাফিনেটমোনকি আসলে, আপনি কাস্টম লগার ব্যবহার করতে পারেন যদি তারা io.Writerইন্টারফেসটি প্রয়োগ করে এবং আপনি যদি ডিফল্ট লগারের মাধ্যমে আউটপুট পরিবর্তন করেন SetOutput()
কংগসবঙ্গাস

16

এটি একটি সরল লগার

package customlogger

import (
    "log"
    "os"
    "sync"
)

type logger struct {
    filename string
    *log.Logger
}

var logger *logger
var once sync.Once

// start loggeando
func GetInstance() *logger {
    once.Do(func() {
        logger = createLogger("mylogger.log")
    })
    return logger
}

func createLogger(fname string) *logger {
    file, _ := os.OpenFile(fname, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0777)

    return &logger{
        filename: fname,
        Logger:   log.New(file, "My app Name ", log.Lshortfile),
    }
}

আপনি এটি এইভাবে ব্যবহার করতে পারেন

package main

import (
    "customlogger"
    "fmt"
    "net/http"
)

func main() {
    logger := customlogger.GetInstance()
    logger.Println("Starting")

    http.HandleFunc("/", sroot)
    http.ListenAndServe(":8080", nil)
}

func sroot(w http.ResponseWriter, r *http.Request) {
    logger := customlogger.GetInstance()

    fmt.Fprintf(w, "welcome")
    logger.Println("Starting")
}

10

আমি জানি এই প্রশ্নটি কিছুটা পুরানো, তবে আমার মতো যদি আপনার প্রকল্পগুলিও একাধিক ছোট ফাইল নিয়ে তৈরি হয় তবে আমি আপনার চতুর্থ বিকল্পটির পক্ষে ভোট দিয়েছি - আমি এটি তৈরি করেছি logger.goযা প্যাকেজ প্রধানের অংশ। এই গো ফাইলটি লগার তৈরি করে, এটিকে একটি ফাইলের জন্য বরাদ্দ করে, এবং এটি বাকী প্রধানকে সরবরাহ করে। দ্রষ্টব্য আমি ত্রুটিমুক্ত বন্ধ করার একটি দৃষ্টিনন্দন উপায় নিয়ে আসিনি ...

package main

import (
    "fmt"
    "log"
    "os"
)

var errorlog *os.File
var logger *log.Logger

func init() {
    errorlog, err := os.OpenFile(logfile,  os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
    if err != nil {
        fmt.Printf("error opening file: %v", err)
        os.Exit(1)
    }

    logger = log.New(errorlog, "applog: ", log.Lshortfile|log.LstdFlags)
}

8
সুতনু বন্ধ করার জন্য, আপনি সম্ভবত পারা defer errorlog.Close()ফাঁসি শেষে বা যেতে এর সংকেত প্যাকেজ ব্যবহার তার বদ্ধ সংকেত হ্যান্ডলার সেট আপ নিশ্চিত করার ভাল golang.org/pkg/os/signal
Anfernee

4

এটি একটি পুরানো প্রশ্ন, তবে আমি http://github.com/romana/rlog (যা আমরা বিকাশ করেছি) ব্যবহারের পরামর্শ দিতে চাই । এটি পরিবেশের ভেরিয়েবলের মাধ্যমে কনফিগার করা হয়, লগর অবজেক্টটি যখন তৈরি হয় এবং যখন আরলগ আমদানি করা হয় তখন আরম্ভ হয়। অতএব, কোনও লগারের চারপাশে যাওয়ার দরকার নেই।

rlog এর বেশ কয়েকটি বৈশিষ্ট্য রয়েছে:

  • সম্পূর্ণরূপে কনফিগারযোগ্য তারিখ / সময় স্ট্যাম্প
  • স্টারডার বা স্টডআউট পাশাপাশি ফাইল হিসাবে একযোগে আউটপুট।
  • স্ট্যান্ডার্ড লগ স্তর (ডিবাগ, তথ্য, ইত্যাদি) পাশাপাশি অবাধে-কনফিগারযোগ্য মাল্টি-লেভেল লগিং।
  • কলারের তথ্য লগ ইন (ফাইল, লাইন নম্বর, ফাংশন) On
  • বিভিন্ন উত্স ফাইলের জন্য বিভিন্ন লগ স্তর সেট করার ক্ষমতা।

এটি খুব ছোট, স্ট্যান্ডার্ড গোলং লাইব্রেরি ব্যতীত কোনও বাহ্যিক নির্ভরতা নেই এবং সক্রিয়ভাবে বিকাশ করা হচ্ছে। উদাহরণ রেপো সরবরাহ করা হয়।


3
আপনি যে পণ্যটির প্রস্তাব দিচ্ছেন তার সাথে আপনার সম্পর্কটি প্রকাশ করার জন্য আপনাকে ধন্যবাদ! এটি প্রশংসা করা হয়।
রবার্ট কলম্বিয়া

2

আমি ডিফল্ট লগ প্যাকেজটি পেয়েছি ( https://golang.org/pkg/log/ ) কিছুটা সীমাবদ্ধ। উদাহরণস্বরূপ, তথ্য বনাম ডিবাগ লগের জন্য কোনও সমর্থন নেই।
কিছুটা আড্ডার পরে, https://github.com/golang/glog ব্যবহার করে স্থির হন । এটি https://github.com/google/glog এর একটি বন্দর বলে মনে হচ্ছে এবং লগিংয়ে শালীন নমনীয়তা দেয়। উদাহরণস্বরূপ স্থানীয়ভাবে কোনও অ্যাপ্লিকেশন চলাকালীন আপনি DEBUG স্তরের লগ চাইতে পারেন তবে উত্পাদনে কেবল INFO / ERROR স্তরে চালাতে চান। সম্পূর্ণ বৈশিষ্ট্য / গাইডের তালিকাটি এখানে, https://google-glog.googlecode.com/svn/trunk/doc/glog.html (এটি সি ++ মডিউলের জন্য, তবে বেশিরভাগ অংশের জন্য গোলং বন্দরে অনুবাদ করে)


0

লগিং মডিউল আপনাকে বিবেচনা করতে পারেন মধ্যে একজন হল klog । এটি 'ভি' লগিং সমর্থন করে যা নির্দিষ্ট স্তরে লগ করার জন্য নমনীয়তা দেয়

klog হ'ল গ্লোব একটি কাঁটাচামচ এবং নিম্নলিখিত ত্রুটিগুলি কাটিয়ে উঠেছে

  • গ্লোব অনেকগুলি "গোটচস" উপস্থাপন করে এবং ধারক পরিবেশে চ্যালেঞ্জগুলির পরিচয় দেয়, যার সবগুলিই ভালভাবে নথিভুক্ত নয়।
  • লগগুলি লগগুলি পরীক্ষা করার সহজ উপায় সরবরাহ করে না যা এটি সফ্টওয়্যার ব্যবহার করে স্থায়িত্ব থেকে বিরত রাখে
  • গ্লোব সি ++ ভিত্তিক এবং ক্লোগ একটি খাঁটি গোলং বাস্তবায়ন implementation

নমুনা বাস্তবায়ন

package main

import (
    "flag"

    "k8s.io/klog"


)

type myError struct {
    str string
}

func (e myError) Error() string {
    return e.str
}

func main() {
    klog.InitFlags(nil)
    flag.Set("v", "1")
    flag.Parse()

    klog.Info("hello", "val1", 1, "val2", map[string]int{"k": 1})
    klog.V(3).Info("nice to meet you")
    klog.Error(nil, "uh oh", "trouble", true, "reasons", []float64{0.1, 0.11, 3.14})
    klog.Error(myError{"an error occurred"}, "goodbye", "code", -1)
    klog.Flush()
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.