Текстовый журнал OpenVPN ставит дату, время и us= значение в одну строку, и последняя из трёх — это часть, которую читатели понимают неправильно. Это микросекундная составляющая этой отметки времени, напечатанная без дополнения нулями. Это не идентификатор сеанса, не имя пользователя и не счётчик, и если считать это так, доля секунды превращается в уверенный неверный вывод. Преобразуйте это как долю отображённой секунды, и остальная часть строки останется читаемой.

Что означают три части строки

Дата и целая секунда идут первыми, а us= несёт остаток меньше секунды. Значение 12345 — это двенадцать тысяч триста сорок пять микросекунд, то есть 0.012345 секунды, поэтому строка описывает 09:15:30.012345, когда напечатанное время 09:15:30. Счётчик начинается заново с каждой новой секундой, поэтому более поздняя строка может напечатать меньшую долю, и ни одни часы не идут назад. Только полная отметка времени упорядочивает события.

2026-11-02 08:41:07 us=4820

Единица — одна миллионная секунды, и шесть цифр us= охватывают весь диапазон от 0.000000 до 0.999999. Пять цифр описывают десятки миллисекунд, а шесть — сотни миллисекунд вплоть до почти целой секунды. Если преобразование даёт долю больше единицы, десятичная запятая сдвинулась, и арифметика неверна. Сделать это вручную — значит разделить напечатанное целое число на миллион и прибавить его к целой секунде.

Дополнение нулями — это ловушка. us=42 — это сорок две микросекунды, записанные как .000042, а не .42. Дополните целое число слева до шести позиций перед преобразованием, и значение перестанет выглядеть как десятичная доля видимых цифр.

Преобразование строки без калькулятора

Возьмите напечатанную секунду за основу и рассматривайте us= как долю. Для 09:15:30 с us=12345 десятичная форма — 09:15:30.012345; для us=900000 она — 09:15:30.900000. Цифры после запятой — это дополненное целое число, а не целое число, разделённое на тысячу. Если сначала записать шестизначную форму, большинство ошибок не возникнет.

Если вы разбираете журналы в отметки времени, разбирайте дату, целую секунду и долю вместе. Разборщик, который предполагает миллисекунды, упорядочит события неверно в тысячу раз, а вывод всё равно выглядит правдоподобно.

Когда поля нет в журнале

Микросекундная часть относится к текстовому формату журнала и появляется только при включённых подробных отметках времени. В форматировщике отметок времени OpenVPN 2.6 она добавляется, когда этот вывод включён и сохранённое значение не равно нулю. Поэтому журнал без us= ничего не говорит о часах или сборке; обычно это означает, что заданная подробность слишком низкая. Проверьте конфигурацию, прежде чем винить синхронизацию времени.

Параметр легко подтвердить по конфигурации сервера. Выполните команду ниже и прочитайте число, которое она вернёт. Подробный вывод отметок времени появляется при уровне подробности 4, поэтому меньшее значение объясняет отсутствующее поле без другой неисправности. Запуск той же конфигурации с --verb 4 показывает поле, как только демон перезапустится с этим уровнем.

grep -nE '^[[:space:]]*verb[[:space:]]+[0-9]' /etc/openvpn/server.conf

Повышение подробности добавляет детали в журнал; оно не улучшает часы. После перезапуска сравните новую строку со старой, чтобы убедиться, что формат изменился, и снова снизьте уровень, когда вопрос будет решён.

Чего не доказывают шесть цифр

Шесть цифр описывают разрешение, а разрешение ничего не говорит о том, согласны ли два хоста насчёт времени. Клиент и сервер могут оба печатать микросекунды, хотя их часы расходятся на секунды. Когда вы сопоставляете события между машинами, записывайте часовой пояс и любое известное смещение и предпочитайте поле, называющее партнёра или сеанс, любой отметке времени. Две строки с одинаковой долей не обязательно относятся к одному соединению.

Сборщик может проставлять отметку на каждой строке при поступлении, что добавляет вторую отметку времени, принадлежащую сборщику, а не OpenVPN. Определите, какую из них вы читаете, прежде чем сравнивать, и сохраняйте исходную строку, чтобы сравнение можно было повторить.

Свежее значение us= не доказывает, что вошёл новый клиент, а повторённое не доказывает дублирующее событие. Поля партнёра и соединения отвечают на эти вопросы.

Похожие статьи