journal: add call to determine current journal file disk usage
This commit is contained in:
parent
ac59a798f2
commit
a1a03e3075
|
@ -513,6 +513,7 @@ MANPAGES = \
|
||||||
man/sd_journal_get_cutoff_realtime_usec.3 \
|
man/sd_journal_get_cutoff_realtime_usec.3 \
|
||||||
man/sd_journal_get_cursor.3 \
|
man/sd_journal_get_cursor.3 \
|
||||||
man/sd_journal_get_fd.3 \
|
man/sd_journal_get_fd.3 \
|
||||||
|
man/sd_journal_get_usage.3 \
|
||||||
man/sd_journal_add_match.3 \
|
man/sd_journal_add_match.3 \
|
||||||
man/sd_journal_seek_head.3
|
man/sd_journal_seek_head.3
|
||||||
|
|
||||||
|
|
2
TODO
2
TODO
|
@ -126,8 +126,6 @@ Features:
|
||||||
|
|
||||||
* add _SYSTEMD_USER_UNIT= field to journal entries
|
* add _SYSTEMD_USER_UNIT= field to journal entries
|
||||||
|
|
||||||
* journal: expose current disk usage
|
|
||||||
|
|
||||||
* dracut-shutdown needs to be ordered before unmounting /boot
|
* dracut-shutdown needs to be ordered before unmounting /boot
|
||||||
|
|
||||||
* wiki: document new logind LockSessions() call
|
* wiki: document new logind LockSessions() call
|
||||||
|
|
|
@ -320,6 +320,14 @@
|
||||||
accessed.</para></listitem>
|
accessed.</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>--disk-usage</option></term>
|
||||||
|
|
||||||
|
<listitem><para>Shows the current disk
|
||||||
|
usage of all
|
||||||
|
journal files.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><option>--setup-keys</option></term>
|
<term><option>--setup-keys</option></term>
|
||||||
|
|
||||||
|
|
|
@ -78,7 +78,8 @@
|
||||||
<citerefentry><refentrytitle>sd_journal_add_match</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>sd_journal_add_match</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>sd_journal_seek_head</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>sd_journal_seek_head</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>sd_journal_get_cursor</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>sd_journal_get_cursor</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>sd_journal_cutoff_realtime_usec</refentrytitle><manvolnum>3</manvolnum></citerefentry>
|
<citerefentry><refentrytitle>sd_journal_cutoff_realtime_usec</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>sd_journal_get_usage</refentrytitle><manvolnum>3</manvolnum></citerefentry>
|
||||||
and
|
and
|
||||||
<citerefentry><refentrytitle>sd_journal_get_fd</refentrytitle><manvolnum>3</manvolnum></citerefentry>
|
<citerefentry><refentrytitle>sd_journal_get_fd</refentrytitle><manvolnum>3</manvolnum></citerefentry>
|
||||||
for more information about the functions
|
for more information about the functions
|
||||||
|
@ -116,6 +117,7 @@
|
||||||
<citerefentry><refentrytitle>sd_journal_seek_head</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>sd_journal_seek_head</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>sd_journal_get_cursor</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>sd_journal_get_cursor</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>sd_journal_cutoff_realtime_usec</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>sd_journal_cutoff_realtime_usec</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>sd_journal_get_usage</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>journalctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>journalctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>sd-id128</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>sd-id128</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>pkg-config</refentrytitle><manvolnum>1</manvolnum></citerefentry>
|
<citerefentry><refentrytitle>pkg-config</refentrytitle><manvolnum>1</manvolnum></citerefentry>
|
||||||
|
|
|
@ -0,0 +1,104 @@
|
||||||
|
<?xml version='1.0'?> <!--*-nxml-*-->
|
||||||
|
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
|
||||||
|
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
|
||||||
|
|
||||||
|
<!--
|
||||||
|
This file is part of systemd.
|
||||||
|
|
||||||
|
Copyright 2012 Lennart Poettering
|
||||||
|
|
||||||
|
systemd is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
systemd is distributed in the hope that it will be useful, but
|
||||||
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<refentry id="sd_journal_get_usage">
|
||||||
|
|
||||||
|
<refentryinfo>
|
||||||
|
<title>sd_journal_get_usage</title>
|
||||||
|
<productname>systemd</productname>
|
||||||
|
|
||||||
|
<authorgroup>
|
||||||
|
<author>
|
||||||
|
<contrib>Developer</contrib>
|
||||||
|
<firstname>Lennart</firstname>
|
||||||
|
<surname>Poettering</surname>
|
||||||
|
<email>lennart@poettering.net</email>
|
||||||
|
</author>
|
||||||
|
</authorgroup>
|
||||||
|
</refentryinfo>
|
||||||
|
|
||||||
|
<refmeta>
|
||||||
|
<refentrytitle>sd_journal_get_usage</refentrytitle>
|
||||||
|
<manvolnum>3</manvolnum>
|
||||||
|
</refmeta>
|
||||||
|
|
||||||
|
<refnamediv>
|
||||||
|
<refname>sd_journal_get_usage</refname>
|
||||||
|
<refpurpose>Journal disk usage</refpurpose>
|
||||||
|
</refnamediv>
|
||||||
|
|
||||||
|
<refsynopsisdiv>
|
||||||
|
<funcsynopsis>
|
||||||
|
<funcsynopsisinfo>#include <systemd/sd-journal.h></funcsynopsisinfo>
|
||||||
|
|
||||||
|
<funcprototype>
|
||||||
|
<funcdef>int <function>sd_journal_get_usage</function></funcdef>
|
||||||
|
<paramdef>sd_journal* <parameter>j</parameter></paramdef>
|
||||||
|
<paramdef>uint64_t* <parameter>bytes</parameter></paramdef>
|
||||||
|
</funcprototype>
|
||||||
|
|
||||||
|
</funcsynopsis>
|
||||||
|
</refsynopsisdiv>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
<title>Description</title>
|
||||||
|
|
||||||
|
<para><function>sd_journal_get_usage()</function>
|
||||||
|
determines the total disk space currently used up by
|
||||||
|
journal files. If
|
||||||
|
<literal>SD_JOURNAL_LOCAL_ONLY</literal> has been
|
||||||
|
passed when opening the journal files this value will
|
||||||
|
only reflect the size of journal files of the local
|
||||||
|
host, otherwise of all hosts.</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
<title>Return Value</title>
|
||||||
|
|
||||||
|
<para><function>sd_journal_get_usage()</function>
|
||||||
|
returns 0 on success or a negative errno-style error
|
||||||
|
code.</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
<title>Notes</title>
|
||||||
|
|
||||||
|
<para>The <function>sd_journal_get_usage()</function>
|
||||||
|
interface is available as shared library, which can be
|
||||||
|
compiled and linked to with the
|
||||||
|
<literal>libsystemd-journal</literal>
|
||||||
|
<citerefentry><refentrytitle>pkg-config</refentrytitle><manvolnum>1</manvolnum></citerefentry>
|
||||||
|
file.</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
<title>See Also</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
<citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>sd-journal</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>sd_journal_open</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
|
||||||
|
</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
</refentry>
|
|
@ -1906,6 +1906,8 @@ fail:
|
||||||
void journal_file_print_header(JournalFile *f) {
|
void journal_file_print_header(JournalFile *f) {
|
||||||
char a[33], b[33], c[33];
|
char a[33], b[33], c[33];
|
||||||
char x[FORMAT_TIMESTAMP_MAX], y[FORMAT_TIMESTAMP_MAX];
|
char x[FORMAT_TIMESTAMP_MAX], y[FORMAT_TIMESTAMP_MAX];
|
||||||
|
struct stat st;
|
||||||
|
char bytes[FORMAT_BYTES_MAX];
|
||||||
|
|
||||||
assert(f);
|
assert(f);
|
||||||
|
|
||||||
|
@ -1970,6 +1972,9 @@ void journal_file_print_header(JournalFile *f) {
|
||||||
if (JOURNAL_HEADER_CONTAINS(f->header, n_entry_arrays))
|
if (JOURNAL_HEADER_CONTAINS(f->header, n_entry_arrays))
|
||||||
printf("Entry Array Objects: %llu\n",
|
printf("Entry Array Objects: %llu\n",
|
||||||
(unsigned long long) le64toh(f->header->n_entry_arrays));
|
(unsigned long long) le64toh(f->header->n_entry_arrays));
|
||||||
|
|
||||||
|
if (fstat(f->fd, &st) >= 0)
|
||||||
|
printf("Disk usage: %s\n", format_bytes(bytes, sizeof(bytes), (off_t) st.st_blocks * 512ULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
int journal_file_open(
|
int journal_file_open(
|
||||||
|
|
|
@ -72,7 +72,8 @@ static enum {
|
||||||
ACTION_NEW_ID128,
|
ACTION_NEW_ID128,
|
||||||
ACTION_PRINT_HEADER,
|
ACTION_PRINT_HEADER,
|
||||||
ACTION_SETUP_KEYS,
|
ACTION_SETUP_KEYS,
|
||||||
ACTION_VERIFY
|
ACTION_VERIFY,
|
||||||
|
ACTION_DISK_USAGE,
|
||||||
} arg_action = ACTION_SHOW;
|
} arg_action = ACTION_SHOW;
|
||||||
|
|
||||||
static int help(void) {
|
static int help(void) {
|
||||||
|
@ -96,6 +97,7 @@ static int help(void) {
|
||||||
"Commands:\n"
|
"Commands:\n"
|
||||||
" --new-id128 Generate a new 128 Bit ID\n"
|
" --new-id128 Generate a new 128 Bit ID\n"
|
||||||
" --header Show journal header information\n"
|
" --header Show journal header information\n"
|
||||||
|
" --disk-usage Show total disk usage\n"
|
||||||
#ifdef HAVE_GCRYPT
|
#ifdef HAVE_GCRYPT
|
||||||
" --setup-keys Generate new FSS key pair\n"
|
" --setup-keys Generate new FSS key pair\n"
|
||||||
" --interval=TIME Time interval for changing the FSS sealing key\n"
|
" --interval=TIME Time interval for changing the FSS sealing key\n"
|
||||||
|
@ -118,7 +120,8 @@ static int parse_argv(int argc, char *argv[]) {
|
||||||
ARG_SETUP_KEYS,
|
ARG_SETUP_KEYS,
|
||||||
ARG_INTERVAL,
|
ARG_INTERVAL,
|
||||||
ARG_VERIFY,
|
ARG_VERIFY,
|
||||||
ARG_VERIFY_KEY
|
ARG_VERIFY_KEY,
|
||||||
|
ARG_DISK_USAGE
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct option options[] = {
|
static const struct option options[] = {
|
||||||
|
@ -141,6 +144,7 @@ static int parse_argv(int argc, char *argv[]) {
|
||||||
{ "interval", required_argument, NULL, ARG_INTERVAL },
|
{ "interval", required_argument, NULL, ARG_INTERVAL },
|
||||||
{ "verify", no_argument, NULL, ARG_VERIFY },
|
{ "verify", no_argument, NULL, ARG_VERIFY },
|
||||||
{ "verify-key", required_argument, NULL, ARG_VERIFY_KEY },
|
{ "verify-key", required_argument, NULL, ARG_VERIFY_KEY },
|
||||||
|
{ "disk-usage", no_argument, NULL, ARG_DISK_USAGE },
|
||||||
{ NULL, 0, NULL, 0 }
|
{ NULL, 0, NULL, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -224,6 +228,10 @@ static int parse_argv(int argc, char *argv[]) {
|
||||||
arg_action = ACTION_VERIFY;
|
arg_action = ACTION_VERIFY;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ARG_DISK_USAGE:
|
||||||
|
arg_action = ACTION_DISK_USAGE;
|
||||||
|
break;
|
||||||
|
|
||||||
#ifdef HAVE_GCRYPT
|
#ifdef HAVE_GCRYPT
|
||||||
case ARG_SETUP_KEYS:
|
case ARG_SETUP_KEYS:
|
||||||
arg_action = ACTION_SETUP_KEYS;
|
arg_action = ACTION_SETUP_KEYS;
|
||||||
|
@ -746,6 +754,19 @@ int main(int argc, char *argv[]) {
|
||||||
goto finish;
|
goto finish;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (arg_action == ACTION_DISK_USAGE) {
|
||||||
|
uint64_t bytes;
|
||||||
|
char sbytes[FORMAT_BYTES_MAX];
|
||||||
|
|
||||||
|
r = sd_journal_get_usage(j, &bytes);
|
||||||
|
if (r < 0)
|
||||||
|
goto finish;
|
||||||
|
|
||||||
|
printf("Journals take up %s on disk.\n", format_bytes(sbytes, sizeof(sbytes), bytes));
|
||||||
|
r = 0;
|
||||||
|
goto finish;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef HAVE_ACL
|
#ifdef HAVE_ACL
|
||||||
if (access("/var/log/journal", F_OK) < 0 && geteuid() != 0 && in_group("adm") <= 0) {
|
if (access("/var/log/journal", F_OK) < 0 && geteuid() != 0 && in_group("adm") <= 0) {
|
||||||
log_error("Unprivileged users can't see messages unless persistent log storage is enabled. Users in the group 'adm' can always see messages.");
|
log_error("Unprivileged users can't see messages unless persistent log storage is enabled. Users in the group 'adm' can always see messages.");
|
||||||
|
|
|
@ -70,3 +70,8 @@ global:
|
||||||
sd_journal_perror;
|
sd_journal_perror;
|
||||||
sd_journal_perror_with_location;
|
sd_journal_perror_with_location;
|
||||||
} LIBSYSTEMD_JOURNAL_187;
|
} LIBSYSTEMD_JOURNAL_187;
|
||||||
|
|
||||||
|
LIBSYSTEMD_JOURNAL_190 {
|
||||||
|
global:
|
||||||
|
sd_journal_get_usage;
|
||||||
|
} LIBSYSTEMD_JOURNAL_188;
|
||||||
|
|
|
@ -2062,6 +2062,29 @@ void journal_print_header(sd_journal *j) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_public_ int sd_journal_get_usage(sd_journal *j, uint64_t *bytes) {
|
||||||
|
Iterator i;
|
||||||
|
JournalFile *f;
|
||||||
|
uint64_t sum = 0;
|
||||||
|
|
||||||
|
if (!j)
|
||||||
|
return -EINVAL;
|
||||||
|
if (!bytes)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
HASHMAP_FOREACH(f, j->files, i) {
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
if (fstat(f->fd, &st) < 0)
|
||||||
|
return -errno;
|
||||||
|
|
||||||
|
sum += (uint64_t) st.st_blocks * 512ULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
*bytes = sum;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* _public_ int sd_journal_query_unique(sd_journal *j, const char *field) { */
|
/* _public_ int sd_journal_query_unique(sd_journal *j, const char *field) { */
|
||||||
/* if (!j) */
|
/* if (!j) */
|
||||||
/* return -EINVAL; */
|
/* return -EINVAL; */
|
||||||
|
|
|
@ -108,6 +108,8 @@ int sd_journal_get_cursor(sd_journal *j, char **cursor);
|
||||||
int sd_journal_get_cutoff_realtime_usec(sd_journal *j, uint64_t *from, uint64_t *to);
|
int sd_journal_get_cutoff_realtime_usec(sd_journal *j, uint64_t *from, uint64_t *to);
|
||||||
int sd_journal_get_cutoff_monotonic_usec(sd_journal *j, const sd_id128_t boot_id, uint64_t *from, uint64_t *to);
|
int sd_journal_get_cutoff_monotonic_usec(sd_journal *j, const sd_id128_t boot_id, uint64_t *from, uint64_t *to);
|
||||||
|
|
||||||
|
int sd_journal_get_usage(sd_journal *j, uint64_t *bytes);
|
||||||
|
|
||||||
/* int sd_journal_query_unique(sd_journal *j, const char *field); /\* missing *\/ */
|
/* int sd_journal_query_unique(sd_journal *j, const char *field); /\* missing *\/ */
|
||||||
/* int sd_journal_enumerate_unique(sd_journal *j, const void **data, size_t *l); /\* missing *\/ */
|
/* int sd_journal_enumerate_unique(sd_journal *j, const void **data, size_t *l); /\* missing *\/ */
|
||||||
/* void sd_journal_restart_unique(sd_journal *j); /\* missing *\/ */
|
/* void sd_journal_restart_unique(sd_journal *j); /\* missing *\/ */
|
||||||
|
|
Loading…
Reference in New Issue