Какие методы логирования из С либы знаете?
От: Hоmunculus  
Дата: 08.01.26 06:23
Оценка:
Есть С API либа (без классов), которая должна подключаться вообще ко всему, то есть к С# прогам, к свифтным прогамина иос, к андроидным прогам, ну и разумеется винда, линукс, мак.
Мне надо изнутри либы в кидать оповещения о происходящем в виде строк с описанием. Не просто коды ошибок. Функции сложные и длинные, иногда несколько-поточные.

Как лучше сделать?

Первое что приходит в голову коллбек — функция со строкой в аргументе. Приложение дает такую функцию и либа ее тянет.
Второе — кидать в файл, но этот кажется кривым. Не хочу через файл.
Как еще можно? Нужно кросс-платформенно и между-языково
Re: Какие методы логирования из С либы знаете?
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 08.01.26 06:47
Оценка: 8 (1) +2
Здравствуйте, Hоmunculus, Вы писали:

H>Первое что приходит в голову коллбек — функция со строкой в аргументе. Приложение дает такую функцию и либа ее тянет.


Это типа как в ffmpeg и куче других либ — хороший вариант.

H>Как еще можно? Нужно кросс-платформенно и между-языково


Как в Windows: код ошибки, GetLastError, описание ошибки по её коду.
Re[2]: Какие методы логирования из С либы знаете?
От: Hоmunculus  
Дата: 08.01.26 06:49
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>Как в Windows: код ошибки, GetLastError, описание ошибки по её коду.


Ну это можно вызвать только после выполнения какой-то функции. А мне надо именно в процессе выполнения функции получать из нее логи
Re[3]: Какие методы логирования из С либы знаете?
От: kov_serg Россия  
Дата: 08.01.26 07:59
Оценка:
Здравствуйте, Hоmunculus, Вы писали:

H>Здравствуйте, Nuzhny, Вы писали:


N>>Как в Windows: код ошибки, GetLastError, описание ошибки по её коду.


H>Ну это можно вызвать только после выполнения какой-то функции. А мне надо именно в процессе выполнения функции получать из нее логи

void fn( void (*write)(void *ctx,const char* data,int size), void* ctx );

но лучше структурой
typedef struct fn_args_t {
  void (*write)(void *ctx,const char* data,int size);
  void *ctx;
  int log_level;
  // other fn args
};
void fn(fn_args_t *args);

можно добавить log_level или каналы если необходимо.
Re[4]: Какие методы логирования из С либы знаете?
От: Hоmunculus  
Дата: 08.01.26 08:09
Оценка:
Здравствуйте, kov_serg, Вы писали:

Ну это и есть коллбек.
Кстати, есть пример как такое из шарпа в либу подсунуть?
Re[5]: Какие методы логирования из С либы знаете?
От: kov_serg Россия  
Дата: 08.01.26 09:26
Оценка: 8 (1)
Здравствуйте, Hоmunculus, Вы писали:

H>Здравствуйте, kov_serg, Вы писали:


H>Ну это и есть коллбек.

H>Кстати, есть пример как такое из шарпа в либу подсунуть?

Примерно так:
using System;
using System.Text;
using System.Runtime.InteropServices;

class Program {
    public delegate void func_t(IntPtr ctx,[MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] byte[] data,int size);

    [DllImport("lib.dll",CallingConvention=CallingConvention.Cdecl)]
    public static extern int func(func_t cb, IntPtr ctx);
    static Program my(IntPtr ctx) { return GCHandle.FromIntPtr(ctx).Target as Program; }
    static void _cb(IntPtr ctx, byte[] data, int size) { my(ctx).cb( Encoding.UTF8.GetString(data) ); }
    
    void cb(string data) {
        Console.WriteLine(data);
    }

    static void Main(string[] args) {
        Program p = new Program();
        
        GCHandle pctx=GCHandle.Alloc(p, GCHandleType.Normal);
        int r = func(new func_t(_cb), GCHandle.ToIntPtr(pctx) );
        pctx.Free();
    }
}
extern "C" __declspec(dllexport) int func( void (*write)(void* ctx,char* data,int size), void* ctx) {
  if (write) write(ctx,"hello",5);
  return 0;
}
Re: Какие методы логирования из С либы знаете?
От: Pzz Россия https://github.com/alexpevzner
Дата: 08.01.26 09:43
Оценка:
Здравствуйте, Hоmunculus, Вы писали:

H>Первое что приходит в голову коллбек — функция со строкой в аргументе. Приложение дает такую функцию и либа ее тянет.

H>Второе — кидать в файл, но этот кажется кривым. Не хочу через файл.
H>Как еще можно? Нужно кросс-платформенно и между-языково

Можно ещё прямо в сислог кидать. В том виде, как принято на платформе.

Но ИМХО, через калбек лучше всего. Оставляет приложению возможность решать, что делать с этими логами.
Re: Какие методы логирования из С либы знаете?
От: graniar  
Дата: 08.01.26 10:22
Оценка:
Здравствуйте, Hоmunculus, Вы писали:

H>Первое что приходит в голову коллбек — функция со строкой в аргументе. Приложение дает такую функцию и либа ее тянет.


Ну вот. Какие аргументы против коллбека вообще могут быть?
Если приложение ничего не хочет знать про логи, просто не дает коллбек, и либа соответственно их никуда не пишет.
Re[2]: Какие методы логирования из С либы знаете?
От: Hоmunculus  
Дата: 08.01.26 10:25
Оценка:
Здравствуйте, graniar, Вы писали:

G>Ну вот. Какие аргументы против коллбека вообще могут быть?


Да никаких. Вот и спросил — может человечество изобрело что-то новенькое, стильное, модное, молодежное, а я не в курсе.
Но у коллбека есть один минус — переводы. Тогда или либо должна знать локаль и содержать в себе все переводы лога, или приложение как-то должно уметь переводить на нужный язык то что либа нагенерит
Отредактировано 08.01.2026 10:27 Hоmunculus . Предыдущая версия .
Re[3]: Какие методы логирования из С либы знаете?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 08.01.26 11:33
Оценка: +1
Здравствуйте, Hоmunculus, Вы писали:

G>>Ну вот. Какие аргументы против коллбека вообще могут быть?


H>Да никаких. Вот и спросил — может человечество изобрело что-то новенькое, стильное, модное, молодежное, а я не в курсе.

H>Но у коллбека есть один минус — переводы. Тогда или либо должна знать локаль и содержать в себе все переводы лога, или приложение как-то должно уметь переводить на нужный язык то что либа нагенерит

Это не является минусом колбека, а минусом конкретной реализации, которая кидается текстом.
Можно в колбэк передавать код сообщения и аргументы, а поиск локализованного текста и подстановку аргументов делает приложение. Или даже можно кидать текст сообщения на английском, только не форматировать его внутри функции. В этом случае приложение ищет локализованное сообщение по оригинальному (обычно английскому) тексту, а потом подставляет аргументы. Примерно как кутишный tr работает.
Маньяк Робокряк колесит по городу
Re[6]: Какие методы логирования из С либы знаете?
От: tapatoon  
Дата: 09.01.26 11:22
Оценка: 6 (1)
Здравствуйте, kov_serg, Вы писали:

_>...


Можно попроще

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void Callback([MarshalAs(UnmanagedType.LPUTF8Str)] string str);

[DllImport("lib", CallingConvention = CallingConvention.Cdecl)]
public static extern void Func(Callback dataReceiver);


using Callback = void (*)(const char* str);
void Func(Callback dataReceiver)
{
   dataReceiver(toUtf8(...));
}


Тут главное сделать удобные врапперы над всем этим, дабы каждый вызов функции не превращался в писанину на несколько строк
Центр ИПсО Сил Специальных Операций
Re[7]: Какие методы логирования из С либы знаете?
От: kov_serg Россия  
Дата: 10.01.26 11:28
Оценка:
Здравствуйте, tapatoon, Вы писали:

T>
T>[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
T>public delegate void Callback([MarshalAs(UnmanagedType.LPUTF8Str)] string str);

T>[DllImport("lib", CallingConvention = CallingConvention.Cdecl)]
T>public static extern void Func(Callback dataReceiver);
T>


T>
T>using Callback = void (*)(const char* str);
T>void Func(Callback dataReceiver)
T>{
T>   dataReceiver(toUtf8(...));
T>}
T>


T>Тут главное сделать удобные врапперы над всем этим, дабы каждый вызов функции не превращался в писанину на несколько строк

Если c# может jit-тить callback-и то остальным нужен указатель на контеркст. Или придётся велосипедить переходники на другой стороне.
Удобство можно добиться обычным врапером. И будет вообще не видно что под капотом. Короче компромис есть всегда. И конкретная реализация зависит от требований к задаче.
Но вызов с void fn(void* ctx,const char* data,int size); и меет более общий характер нежели void fn(const char* cstr_utf8); хотя одно всегда можно привести к другому, но это требует дополнительных усилий
по описанию/документированию происходящего и дополнительным накладным расходам для всех сторон.
Re: Какие методы логирования из С либы знаете?
От: ArtDenis Россия  
Дата: 10.01.26 13:44
Оценка:
Здравствуйте, Hоmunculus, Вы писали:

H>коллбек — функция со строкой в аргументе. Приложение дает такую функцию и либа ее тянет.


Норм вариант
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.