tạo một tệp nhật ký


22

Có cách nào để tạo một tệp nhật ký để duy trì một số dữ liệu trong / var / log / với sự trợ giúp của một số chức năng thư viện hoặc cuộc gọi hệ thống bằng ngôn ngữ c trong linux. Và tôi cũng muốn biết các tiêu chuẩn mà chúng ta nên tuân theo để viết và xử lý nhật ký. Cảm ơn


Xin lưu ý rằng các câu hỏi lập trình thường không có chủ đề ở đây; bạn nên hỏi họ về Stack Overflow . Một lời giải thích về API là ổn ở đây, nhưng giải thích về cách sử dụng nó trong C hoặc ngôn ngữ lập trình khác thường thuộc về Stack Overflow.
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


31

Cách tiêu chuẩn để đăng nhập từ chương trình C là syslog.

Bắt đầu bằng cách bao gồm tệp tiêu đề:

#include <syslog.h>

Sau đó, trong chương trình của bạn, bạn nên cấu hình nhật ký hệ thống bằng cách gọi openlog:

openlog("programname", 0, LOG_USER);

Đối số đầu tiên là nhận dạng hoặc thẻ, được tự động thêm vào đầu mỗi tin nhắn. Đặt tên chương trình của bạn ở đây.

Đối số thứ hai là các tùy chọn bạn muốn sử dụng hoặc 0cho hành vi bình thường. Danh sách đầy đủ các tùy chọn là trong man 3 syslog. Một thứ bạn có thể thấy hữu ích là LOG_PID, nó làm cho syslog cũng ghi lại id quá trình trong thông điệp tường trình.

Sau đó, mỗi lần bạn muốn viết một thông điệp tường trình, bạn gọi syslog:

syslog(LOG_INFO, "%s", "Message");

Đối số đầu tiên là ưu tiên. Phạm vi ưu tiên từ DEBUG(ít nhất là quan trọng) đến EMERG(chỉ dành cho trường hợp khẩn cấp) với DEBUG, INFOERRđược sử dụng phổ biến nhất. Xem man 3 syslogcho các lựa chọn của bạn.

Đối số thứ hai và thứ ba là một định dạng và thông báo, giống như printf.

Tệp nhật ký này xuất hiện trong tùy thuộc vào cài đặt nhật ký hệ thống của bạn.

Với một thiết lập mặc định, nó có thể đi vào /var/log/messages.


Bạn có thể thiết lập một log file tùy chỉnh bằng cách sử dụng một trong những cơ sở vật chất trong phạm vi LOG_LOCAL0đến LOG_LOCAL7.

Bạn sử dụng chúng bằng cách thay đổi:

openlog("programname", 0, LOG_USER);

đến

openlog("programname", 0, LOG_LOCAL0);

hoặc là

openlog("programname", 0, LOG_LOCAL1);

v.v.

và thêm một mục tương ứng vào /etc/syslog.conf, vd

local1.info /var/log/programname.log

và khởi động lại máy chủ syslog, vd

pkill -HUP syslogd

Các .infophần của local1.infophương tiện trên tất cả các tin nhắn được INFOhoặc quan trọng hơn sẽ được đăng nhập, bao gồm INFO, NOTICE, ERR(lỗi), CRIT(quan trọng), vv, nhưng không DEBUG.


Hoặc, nếu bạn có rsyslog, bạn có thể thử bộ lọc dựa trên thuộc tính , ví dụ:

:syslogtag, isequal, "programname:"    /var/log/programname.log

Syslogtag phải chứa ":".

Hoặc, nếu bạn dự định phân phối phần mềm của mình cho người khác, có lẽ không nên dựa vào việc sử dụng LOG_LOCALhoặc rsyslogbộ lọc.

Trong trường hợp đó, bạn nên sử dụng LOG_USER(nếu đó là một chương trình bình thường) hoặc LOG_DAEMON(nếu đó là máy chủ), viết thông báo khởi động và thông báo lỗi bằng cách sử dụng syslog, nhưng viết tất cả các thông điệp tường trình của bạn vào một tệp bên ngoài syslog. Ví dụ, Apache HTTPd ghi nhật ký đến /var/log/apache2/*hoặc /var/log/httpd/*, tôi giả sử sử dụng các cuộc gọi / và open/ thường xuyên .fopenwriteprintf


Cảm ơn. Đây là thông tin khá hữu ích. Nhưng bạn vui lòng giải thích thêm về tùy chọn log_local0-7. Ví dụ. Tôi muốn ghi dữ liệu của mình (có <self> word trong dòng nhật ký) vào tệp self.log. và một số nhật ký trong các tập tin khác.
Sushant Jain

@Sushant Jain: Bạn đang nhắm mục tiêu phân phối và phiên bản Linux nào? Bạn có syslog cũ (ksyslogd) hoặc rsyslog? rpm -qa | grep sysloghoặc dpkg -l '*syslog*'có thể sẽ cho bạn biết cái nào
Mikel

log_local * là, thẳng thắn, di tích từ khi trở sysklogdthành trò chơi duy nhất trong thị trấn cho phần mềm syslog. Ngày nay phần mềm như syslog-ng, rsyslogdsyslogtồn tại và có khả năng lọc phức tạp hơn nhiều so với dịch vụ chỉ / cấp độ.
Shadur

Cảm ơn rất nhiều. Vấn đề của tôi đã được giải quyết. Tôi có thêm một truy vấn về phân tích dữ liệu được lưu trữ trong tệp nhật ký. Có cách nào tốt để làm điều này không. Trên thực tế tôi đang cố gắng để làm cho một công cụ thống kê hệ thống. Vì vậy, tôi cần nó.
Sushant Jain

@Sainant Jain. Vui mừng được giúp đỡ. Vui lòng gửi câu hỏi phân tích nhật ký của bạn dưới dạng một câu hỏi riêng biệt để mọi người có thể xem nó và cung cấp câu trả lời thích hợp.
Mikel

2

Bạn sẽ muốn #include <syslog.h>, sau đó sử dụng các syslog()chức năng để gửi dữ liệu tới bất kỳ chương trình ghi nhật ký hệ thống nào đang hoạt động.

Xem trang người đàn ông ở đây .


Hàm syslog () ghi dữ liệu vào / var / log / syslog. trong khi tôi muốn viết nhật ký trong tập tin của riêng tôi
Sushant Jain

Như Mikel giải thích bên dưới, bạn có thể gắn thẻ thông điệp tường trình của mình theo cách syslog hiểu chương trình của bạn là gì, sau đó định cấu hình nhật ký hệ thống để ghi thông điệp nhật ký chương trình của bạn vào một tệp khác.
Caleb

1

Có rất nhiều khả năng, kế hoạch của bạn là gì? Bạn chỉ cần một tùy chọn để đăng nhập từ dòng lệnh? Hãy xem logger(bao gồm trong bsdutils ). Chỉ loại:

usr@srv % logger test

và nó sẽ ghi lại một cái gì đó như thế này vào /var/log/syslog:

Apr 25 07:55:15 localhost usr: test

xem thêm man logger. Tùy thuộc vào trình nền đăng nhập của bạn, bạn có thể sắp xếp các thư này vào các tệp cụ thể hoặc lọc chúng theo mức độ ưu tiên.

Ngoài ra còn có một số giải pháp cho các ngôn ngữ lập trình khác nhau, vì vậy vui lòng cho tôi biết bạn muốn làm gì ;-)


Thật ra tôi muốn làm điều đó bằng ngôn ngữ c. và tôi đã có thông tin trong bài mikel.
Sushant Jain

1

Lọc theo tên chương trình được viết khác với những gì được đề cập ở trên, đối với các phiên bản gần đây của rsyslog(phiên bản trên máy của tôi là 5.8.6) như được hiển thị bên dưới:

if $programname == 'popa3d' then /var/log/popa3d.log

Để biết thêm thông tin, xem tại đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.